XML DOM解析(Java)的一个简单实例
发布日期:2021-05-09 05:16:45 浏览次数:17 分类:博客文章

本文共 3776 字,大约阅读时间需要 12 分钟。

 

  关于DOM解析的基础内容见上一篇文章:

  

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

 

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

  首先,是XML文档:books.xml

Harry Potter
J K. Rowling
2005
29.99
Everyday Italian
Giada De Laurentiis
2005
30.00
Learning XML
Erik T. Ray
2003
39.95
XQuery Kick Start
James McGovern
Per Bothner
Kurt Cagle
James Linn
Vaidyanathan Nagarajan
2003
49.99

  把这个文档放在项目的根路径下,与src目录平行,就可以使用相对路径来引用了。

 

  新建Java类,解析如下:

package com.example.xml.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.NodeList;public class DomTest1{    public static void main(String[] args) throws Exception    {        // step 1:获得DOM解析器工厂        // 工厂的作用是创建具体的解析器        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();        // step 2:获得具体的dom解析器        DocumentBuilder db = dbf.newDocumentBuilder();        // step 3:解析一个xml文档,获得Document对象(根节点)        // 此文档放在项目目录下即可        Document document = db.parse(new File("books.xml"));        // 根据标签名访问节点        NodeList list = document.getElementsByTagName("book");        System.out.println("list length: " + list.getLength());        // 遍历每一个节点        for (int i = 0; i < list.getLength(); ++i)        {            System.out.println("----------------------");            // 获得元素,将节点强制转换为元素            Element element = (Element) list.item(i);            // 此时element就是一个具体的元素            // 获取子元素:子元素title只有一个节点,之后通过getNodeValue方法获取节点的值            String content0 = element.getElementsByTagName("title").item(0)                    .getNodeValue();            System.out.println(content0);// 此处打印出为null            // 因为节点getNodeValue的值永远为null            // 解决方法:加上getFirstChild()            String content = element.getElementsByTagName("title").item(0)                    .getFirstChild().getNodeValue();            System.out.println("title: " + content);// 此处打印出书名            // 后面类似处理即可:            content = element.getElementsByTagName("author").item(0)                    .getFirstChild().getNodeValue();            System.out.println("author: " + content);            content = element.getElementsByTagName("year").item(0)                    .getFirstChild().getNodeValue();            System.out.println("year: " + content);            content = element.getElementsByTagName("price").item(0)                    .getFirstChild().getNodeValue();            System.out.println("price: " + content);        }    }}

  具体过程参见注释。

 

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

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

 

  我们在这里使用DocumentBuilderFactory的目的是为了创建与具体解析器无关的程序,当DocumentBuilderFactory类的静态方法newInstance()被调用时,它根据一个系统变量来决定具体使用哪一个解析器。

  又因为所有的解析器都服从于JAXP所定义的接口,所以无论具体使用哪一个解析器,代码都是一样的。

  所以当在不同的解析器之间进行切换时,值需要更改系统变量的值,而不用更改任何代码。这就是工厂所带来的好处。

 

DocumentBuilder db = dbf.newDocumentBuilder();

  当获得一个工厂对象之后,使用它的静态方法newDocumentBuilder(),可以获得一个DocumentBuilder对象

  这个对象代表了具体的DOM解析器

  解析器的具体实现对于程序来说并不重要。  

 

  然后,我们就可以利用这个解析器对文档进行解析了。

  Sun公司提供了默认的工厂和默认的解析器,上面的例子中就使用了默认的解析器。

 

 

参考资料

  圣思园张龙老师XML视频教程。

  w3school XML DOM 教程:

  

  Java API文档:

  

上一篇:XML的DOM解析 Java实现 例子二
下一篇:XML DOM解析 基础概念

发表评论

最新留言

关注你微信了!
[***.104.42.241]2025年03月23日 21时21分13秒