XML DOM解析(Java)的一个简单实例
2013-06-01 22:52
477 查看
关于DOM解析的基础内容见上一篇文章:/article/4671965.html
JAXP(Java API for XML Parsing) :用于XML解析的Java API。
本文通过一个实际的代码例子来说明如何用Java提供的DOM相关的类和接口解析XML:
首先,是XML文档:books.xml
把这个文档放在项目的根路径下,与src目录平行,就可以使用相对路径来引用了。
新建Java类,解析如下:
具体过程参见注释。
首先,我们需要建立一个解析器工厂,以利用这个工厂来获得一个具体的解析器对象。
我们在这里使用DocumentBuilderFactory的目的是为了创建与具体解析器无关的程序,当DocumentBuilderFactory类的静态方法newInstance()被调用时,它根据一个系统变量来决定具体使用哪一个解析器。
又因为所有的解析器都服从于JAXP所定义的接口,所以无论具体使用哪一个解析器,代码都是一样的。
所以当在不同的解析器之间进行切换时,值需要更改系统变量的值,而不用更改任何代码。这就是工厂所带来的好处。
当获得一个工厂对象之后,使用它的静态方法newDocumentBuilder(),可以获得一个DocumentBuilder对象。
这个对象代表了具体的DOM解析器。
解析器的具体实现对于程序来说并不重要。
然后,我们就可以利用这个解析器对文档进行解析了。
Sun公司提供了默认的工厂和默认的解析器,上面的例子中就使用了默认的解析器。
w3school XML DOM 教程:
http://www.w3school.com.cn/xmldom/index.asp
Java API文档:
http://docs.oracle.com/javase/7/docs/api/index.html
JAXP(Java API for XML Parsing) :用于XML解析的Java API。
本文通过一个实际的代码例子来说明如何用Java提供的DOM相关的类和接口解析XML:
首先,是XML文档:books.xml
<?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book category="children"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="cooking"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="web"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> <book category="web"> <title lang="en">XQuery Kick Start</title> <author>James McGovern</author> <author>Per Bothner</author> <author>Kurt Cagle</author> <author>James Linn</author> <author>Vaidyanathan Nagarajan</author> <year>2003</year> <price>49.99</price> </book> </bookstore>
把这个文档放在项目的根路径下,与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 教程:
http://www.w3school.com.cn/xmldom/index.asp
Java API文档:
http://docs.oracle.com/javase/7/docs/api/index.html
相关文章推荐
- XML DOM解析(Java)的一个简单实例
- java实现一个简单的Web服务器实例解析
- java简单快速排序实例解析
- 一个简单的hibernate+mysql的实例java/jsp开发
- 搜索引擎(建立一个简单的java Lucene实例)
- 一个简单的java链接oracle数据库实例
- 致java初学者:理解每一句java代码,给出一个简单实例。
- java swing最简单实例(1) 一个空的JFrame
- 【Android 网络数据解析实现一个简单的新闻实例(一)】
- 一个最简单的AJAX实例及解析
- java--通过sax方式解析xml文件的简单实例
- Java解析XML文档(简单实例)——dom解析xml
- java 文件上传 与 把文件解析成一个字节数组简单的后台示例
- 一个简单的JAVA线程池实例
- java.io.File写入写出的一个简单实例
- java swing最简单实例(2) 往JFrame里面放一个容器或组件
- java实现一个叫简单的xml解析
- 一个最简单的AJAX实例及解析
- JAVA解析XML简单实例
- 初学者,写了一个java下lucene全文检索简单实例,可直接运行