天天看點

[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