XML(七)-DOM解析

DOM解析

JAXP(Java API for XML Parsing) :用于XML解析的Java API。

本文通过一个实际的代码例子来说明如何用Java提供的DOM相关的类和接口解析XML:

首先,是XML文档:persons.xml

<?xml version="1.0"  encoding="UTF-8" standalone="yes"?>
<!DOCTYPE persons [
<!ENTITY xx "我不是一个随便的人,我随便起来不是人">
]>
<persons>
    <![CDATA[
        从今天起,恶心才刚刚开始,
        但是这很重要,我不会把不重要的东西教给大家!
    ]]>
    <!-- 这是xml文档的注释 -->
    <person id = "p01">
        <name>张三</name>
        <age>15</age>
        <address>南京市</address>
        <info>&xx;</info>
    </person>
    <person id = "p02">
        <name>李小龙</name>
        <age>20</age>
        <address>美国</address>
    </person>
    <person id = "p03">
        <name>张小凡</name>
        <age>21</age>
        <address>香港</address>
    </person>
</persons>

新建Java类,解析如下:

package cn.org.kingdom.dom;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class DomParseTest {
    public static void main(String[] args)throws Exception {
        //step1:获得document解析器工厂
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        //step2:获得document解析器
        DocumentBuilder db = dbf.newDocumentBuilder();
        //step3:通过document解析器得到文档对象
        Document doc = db.parse(new File("src/persons.xml"));
        //step4:获得所有的person节点
        NodeList list = doc.getElementsByTagName("person");
        //step5:循环遍历
        for(int i = 0 ;i<list.getLength();i++) {
            Node node = list.item(i);
            Element e = (Element) node;
            //注意元素<name></name>之间是文本节点也点新获取
            String name = e.getElementsByTagName("name").item(0).getFirstChild().getNodeValue();
            String age = e.getElementsByTagName("age").item(0).getFirstChild().getNodeValue();
            String address = e.getElementsByTagName("address").item(0).getFirstChild().getNodeValue();
            System.out.println(name+"-->"+age+"-->"+address);
        }
    }
}

首先,我们需要建立一个解析器工厂,以利用这个工厂来获得一个具体的解析器对象

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

我们在这里使用DocumentBuilderFactory的目的是为了创建与具体解析器无关的程序,当DocumentBuilderFactory类的静态方法newInstance()被调用时,它根据一个系统变量来决定具体使用哪一个解析器。又因为所有的解析器都服从于JAXP所定义的接口,所以无论具体使用哪一个解析器,代码都是一样的。所以当在不同的解析器之间进行切换时,值需要更改系统变量的值,而不用更改任何代码。这就是工厂所带来的好处。

DocumentBuilder db = dbf.newDocumentBuilder();

当获得一个工厂对象之后,使用它的静态方法newDocumentBuilder(),可以获得一个DocumentBuilder对象这个对象代表了具体的DOM解析器。

解析器的具体实现对于程序来说并不重要,然后,我们就可以利用这个解析器对文档进行解析了。Sun公司提供了默认的工厂和默认的解析器,上面的例子中就使用了默认的解析器

 

 

 

posted @ 2016-05-17 23:09  Mirindasky  阅读(157)  评论(0编辑  收藏  举报