XML(七)-DOM解析

来源:互联网 发布:易语言客户端发送数据 编辑:程序博客网 时间:2024/05/17 03:48
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公司提供了默认的工厂和默认的解析器,上面的例子中就使用了默认的解析器

 

 

 

原创粉丝点击