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<element> booklist = rootelement.getchildren();</code>
(6)根据节点获取属性节点集合
<code>list<attribute> 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<element> getchildren()
<code>// rootelement为element对象</code>
(3)返回节点的所有属性节点的集合
public java.util.list<attribute> getattributes()
<code>// book为element对象</code>
<code>list<attribute> 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><author>scott meyers</author></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<element> 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<attribute> 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