天天看点

[Java开发之路](12)JDOM和DOM4J解析XML文档

1. jdom解析xml文档

1.1 简介

jdom是一个开源项目,它基于树型结构,利用纯java的技术对xml文档实现解析、生成、序列化以及多种操作。jdom 直接为java编程服务。它利用更为强有力的java语言的诸多特性(方法重载、集合概念以及映射),把sax和dom的功能有效地结合起来。在使用设计上尽可能地隐藏原来使用xml过程中的复杂性。利用jdom处理xml文档将是一件轻松、简单的事。

jdom帮助文档 : http://www.jdom.org/docs/apidocs/

jar包下载地址:点击打开链接

1.2 解析步骤

(1)创建saxbuilder对象

<code>saxbuilder saxbuilder = new saxbuilder();</code>

(2)创建输入流对象并将xml文档加载到输入流中

<code>fileinputstream inputstream = new fileinputstream("d:\\bookstore.xml");</code>

(3)通过saxbuilder对象的build方法将输入流加载到saxbuilder中(注意:document 所引用的包是org.jdom2.document;)

<code>document document = saxbuilder.build(inputstream);</code>

(4)通过document对象获取xml文档的根节点

<code>element rootelement = document.getrootelement();</code>

(5)根据根节点获取根节点下的子节点集合

<code>list&lt;element&gt; booklist = rootelement.getchildren();</code>

(6)根据节点获取属性节点集合

<code>list&lt;attribute&gt; attrlist = book.getattributes();</code>

(7)根据节点(元素节点或者属性节点)获取节点名称和节点值

<code>// 属性名称</code>

<code>node.getname();</code>

<code>// 属性值</code>

<code>node.getvalue();</code>

1.3 主要方法

(1)返回文档的根节点

public element getrootelement()

<code>// document为document对象</code>

(2)返回节点的所有子节点的集合

public java.util.list&lt;element&gt; getchildren()

<code>// rootelement为element对象</code>

(3)返回节点的所有属性节点的集合

public java.util.list&lt;attribute&gt; getattributes()

<code>// book为element对象</code>

<code>list&lt;attribute&gt; attrlist = book.getattributes()</code>

(4)根据子节点的名称返回节点的子节点

public element getchild(java.lang.string cname)

<code>element titleelement = book.getchild("title");</code>

(5)返回节点的名称

public java.lang.string getname()

<code>// titleelement为title节点</code>

<code>titleelement.getname();</code>

(6)返回节点值

public java.lang.string getvalue()、

<code>titleelement.getvalue()</code>

dom方式getnodevalue() 对于元素节点时返回null。不同于dom方式,jdom无论是属性节点还是元素节点都会返回节点对应的文本值。

<code>&lt;author&gt;scott meyers&lt;/author&gt;</code>

对于这个节点来说,dom的getnodevalue()返回null,jdom的getvalue()返回"scott meyers"。

1.3 具体实例

<code>package com.qunar.xml;</code>

<code> </code>

<code>import java.io.fileinputstream;</code>

<code>import java.io.filenotfoundexception;</code>

<code>import java.io.ioexception;</code>

<code>import java.util.list;</code>

<code>import org.jdom2.attribute;</code>

<code>import org.jdom2.document;</code>

<code>import org.jdom2.element;</code>

<code>import org.jdom2.jdomexception;</code>

<code>import org.jdom2.input.saxbuilder;</code>

<code>/**</code>

<code>* jdom解析xml文档</code>

<code>* @author sjf0115</code>

<code>*</code>

<code>*/</code>

<code>public class jdomxmlcode {</code>

<code>public static void main(string[] args) {</code>

<code>try {</code>

<code>// 创建saxbuilder对象</code>

<code>// 创建输入流对象并将xml文档加载到输入流中</code>

<code>// 通过saxbuilder对象的build方法将输入流加载到saxbuilder中</code>

<code>// 通过document对象获取xml文档的根节点</code>

<code>// 根据根节点获取根节点下的子节点集合</code>

<code>// 遍历子节点</code>

<code>for (element book : booklist) {</code>

<code>system.out.println("开始解析一本书...");</code>

<code></code>

<code>// 解析属性</code>

<code>for (attribute attribute : attrlist) {</code>

<code>system.out.print("---" + attribute.getname() + ":");</code>

<code>system.out.println(attribute.getvalue());</code>

<code>}//for</code>

<code>// 获取book节点下的子节点</code>

<code>list&lt;element&gt; bookchildren = book.getchildren();</code>

<code>for (element bookchild : bookchildren) {</code>

<code>// 节点名称</code>

<code>system.out.print("------" + bookchild.getname() + ":");</code>

<code>// 节点值</code>

<code>system.out.println(bookchild.getvalue());</code>

<code>system.out.println("结束解析一本书...");</code>

<code>} catch (filenotfoundexception e) {</code>

<code>e.printstacktrace();</code>

<code>} catch (jdomexception e) {</code>

<code>} catch (ioexception e) {</code>

<code>}</code>

运行结果:

开始解析一本书...

---category:java

------title:java多线程编程核心技术

------author:高洪岩

------year:2015

------price:69.00

结束解析一本书...

---category:c++

------title:effective c++: 55 specific ways to improve your programs and designs

------author:scott meyers

------year:2006

------price:58.00

---category:web

------title:learning xml

------author:erik t. ray

------year:2016

------price:39.95

2. dom4j解析xml文档

2.1 简介

dom4j是一个java的xml api,类似于jdom,用来读写xml文件的。dom4j是一个十分优秀的javaxml api,具有性能优异、功能强大和极其易使用的特点,同时它也是一个开放源代码的软件,可以在sourceforge上找到它。如今可以看到越来越多的java软件都在使用dom4j来读写xml,特别值得一提的是连sun的jaxm也在用dom4j。这已经是必须使用的jar包,

hibernate也用它来读写配置文件。

2.2解析

(1)创建saxreader对象

<code>saxreader saxreader = new saxreader();</code>

(2)通过saxreader对象的read方法加载xml文档获取document对象

<code>document document = saxreader.read(new file("d:\\bookstore.xml"));</code>

(3)通过document对象获取根节点

<code>element bookstore = document.getrootelement();</code>

(4)通过element对象的elementiterator方法获取迭代器

<code>iterator iterator = bookstore.elementiterator();</code>

(5)遍历迭代器获取根节点的信息

<code>while (iterator.hasnext()) {</code>

<code>// 获取下一个子节点</code>

<code>element book = (element)iterator.next();</code>

(6)获取属性节点的属性名称和属性值

<code>// 获取book的属性节点集合</code>

<code>list&lt;attribute&gt; bookattr = book.attributes();</code>

<code>// 遍历book属性节点</code>

<code>for (attribute attribute : bookattr) {</code>

<code>// 获取book的属性节点的属性名称以及属性值</code>

<code>system.out.println("name:" + attribute.getname() + " value:" + attribute.getvalue());</code>

(7)获取元素节点的节点名称和对应的文本值

<code>iterator ite = book.elementiterator();</code>

<code>// 遍历book节点的子节点</code>

<code>while(ite.hasnext()){</code>

<code>// book节点的子节点</code>

<code>element bookchild = (element)ite.next();</code>

<code>system.out.println("name:" + bookchild.getname() + " value:" + bookchild.getstringvalue());</code>

<code>//system.out.println("name:" + bookchild.getname() + " value:" + bookchild.gettext());</code>

<code>}//while</code>

2.3 具体案例

<code>import java.io.file;</code>

<code>import java.util.iterator;</code>

<code>import org.dom4j.attribute;</code>

<code>import org.dom4j.document;</code>

<code>import org.dom4j.documentexception;</code>

<code>import org.dom4j.element;</code>

<code>import org.dom4j.io.saxreader;</code>

<code>public class dom4jxmlcode {</code>

<code>// 创建saxreader对象</code>

<code>// 通过saxreader对象的read方法加载xml文档获取document对象</code>

<code>// 通过document对象获取根节点</code>

<code>// 通过element对象的elementiterator方法获取迭代器</code>

<code>// 遍历根节点的子节点</code>

<code>// 获取下一个元素节点</code>

<code>system.out.println("name:" + bookchild.getname() + " value:" + bookchild.getstringvalue());</code>

<code>} catch (documentexception e) {</code>

name:category   value:java

name:title   value:java多线程编程核心技术

name:author   value:高洪岩

name:year   value:2015

name:price   value:69.00

name:category   value:c++

name:title   value:effective c++: 55 specific ways to improve your programs and designs

name:author   value:scott meyers

name:year   value:2006

name:price   value:58.00

name:category   value:web

name:title   value:learning xml

name:author   value:erik t. ray

name:year   value:2016

name:price   value:39.95