### 1.JDOM解析XML文檔
1.1 簡介
JDOM是一個開源項目,它基于樹型結構,利用純JAVA的技術對XML文檔實現解析、生成、序列化以及多種操作。JDOM 直接為JAVA編程服務。它利用更為強有力的JAVA語言的諸多特性(方法重載、集合概念以及映射),把SAX和DOM的功能有效地結合起來。在使用設計上盡可能地隱藏原來使用XML過程中的復雜性。利用JDOM處理XML文檔將是一件輕松、簡單的事。
JDOM幫助文檔 :?[http://www.jdom.org/docs/apidocs/](http://www.jdom.org/docs/apidocs/)
Jar包下載地址:[點擊打開鏈接](http://download.csdn.net/detail/sunnyyoona/9387707)
1.2 解析步驟
(1)創建SAXBuilder對象
~~~
SAXBuilder saxBuilder = new SAXBuilder();
~~~
(2)創建輸入流對象并將XML文檔加載到輸入流中
~~~
FileInputStream inputStream = new FileInputStream("D:\\bookstore.xml");
~~~
(3)通過saxBuilder對象的build方法將輸入流加載到saxBuilder中(注意:Document 所引用的包是org.jdom2.Document;)
~~~
Document document = saxBuilder.build(inputStream);
~~~
(4)通過document對象獲取XML文檔的根節點
~~~
Element rootElement = document.getRootElement();
~~~
(5)根據根節點獲取根節點下的子節點集合
~~~
List<Element> bookList = rootElement.getChildren();
~~~
(6)根據節點獲取屬性節點集合
~~~
List<Attribute> attrList = book.getAttributes();
~~~
(7)根據節點(元素節點或者屬性節點)獲取節點名稱和節點值
~~~
// 屬性名稱
node.getName();
// 屬性值
node.getValue();
~~~
1.3 主要方法
(1)返回文檔的根節點
public Element getRootElement()
~~~
// document為Document對象
Element rootElement = document.getRootElement();
~~~
(2)返回節點的所有子節點的集合
public java.util.List<Element> getChildren()
~~~
// rootElement為Element對象
List<Element> bookList = rootElement.getChildren();
~~~
(3)返回節點的所有屬性節點的集合
public java.util.List<Attribute> getAttributes()
~~~
// book為Element對象
List<Attribute> attrList = book.getAttributes()
~~~
(4)根據子節點的名稱返回節點的子節點
public Element getChild(java.lang.String cname)
~~~
Element titleElement = book.getChild("title");
~~~
(5)返回節點的名稱
public java.lang.String getName()
~~~
// titleElement為title節點
titleElement.getName();
~~~
(6)返回節點值
public java.lang.String getValue()、
~~~
titleElement.getValue()
~~~
DOM方式getNodeValue() 對于元素節點時返回null。不同于DOM方式,JDOM無論是屬性節點還是元素節點都會返回節點對應的文本值。
~~~
<author>Scott Meyers</author>
~~~
對于這個節點來說,DOM的getNodeValue()返回null,JDOM的getValue()返回"Scott Meyers"。
1.3 具體實例
~~~
package com.qunar.xml;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;
import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
/**
* JDOM解析XML文檔
* @author sjf0115
*
*/
public class JDOMXMLCode {
public static void main(String[] args) {
try {
// 創建SAXBuilder對象
SAXBuilder saxBuilder = new SAXBuilder();
// 創建輸入流對象并將XML文檔加載到輸入流中
FileInputStream inputStream = new FileInputStream("D:\\bookstore.xml");
// 通過saxBuilder對象的build方法將輸入流加載到saxBuilder中
Document document = saxBuilder.build(inputStream);
// 通過document對象獲取XML文檔的根節點
Element rootElement = document.getRootElement();
// 根據根節點獲取根節點下的子節點集合
List<Element> bookList = rootElement.getChildren();
// 遍歷子節點
for (Element book : bookList) {
System.out.println("開始解析一本書...");
// 解析屬性
List<Attribute> attrList = book.getAttributes();
for (Attribute attribute : attrList) {
// 屬性名稱
System.out.print("---" + attribute.getName() + ":");
// 屬性值
System.out.println(attribute.getValue());
}//for
// 獲取book節點下的子節點
List<Element> bookChildren = book.getChildren();
for (Element bookChild : bookChildren) {
// 節點名稱
System.out.print("------" + bookChild.getName() + ":");
// 節點值
System.out.println(bookChild.getValue());
}//for
System.out.println("結束解析一本書...");
}//for
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (JDOMException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
~~~
**運行結果:**
<table cellspacing="0" cellpadding="0" style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:942px"><tbody><tr><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:941px"><br/><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">開始解析一本書...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">---category:Java</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">------title:Java多線程編程核心技術</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">------author:高洪巖</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">------year:2015</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">------price:69.00</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">結束解析一本書...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">開始解析一本書...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">---category:C++</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">------title:Effective?C++:?55?Specific?Ways?to?Improve?Your?Programs?and?Designs</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">------author:Scott?Meyers</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">------year:2006</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">------price:58.00</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">結束解析一本書...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">開始解析一本書...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">---category:Web</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">------title:Learning?XML</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">------author:Erik?T.?Ray</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">------year:2016</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">------price:39.95</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">結束解析一本書...</span></div></td></tr></tbody></table>
### 2.DOM4J解析XML文檔
2.1 簡介
DOM4J是一個Java的XML API,類似于JDOM,用來讀寫XML文件的。DOM4J是一個十分優秀的JavaXML API,具有性能優異、功能強大和極其易使用的特點,同時它也是一個開放源代碼的軟件,可以在SourceForge上找到它。如今可以看到越來越多的Java軟件都在使用DOM4J來讀寫XML,特別值得一提的是連Sun的JAXM也在用DOM4J。這已經是必須使用的jar包, Hibernate也用它來讀寫配置文件。
Jar包下載地址:[點擊打開鏈接](http://download.csdn.net/detail/sunnyyoona/9388272)
2.2解析
(1)創建SAXReader對象
~~~
SAXReader saxReader = new SAXReader();
~~~
(2)通過SaxReader對象的read方法加載XML文檔獲取Document對象
~~~
Document document = saxReader.read(new File("D:\\bookstore.xml"));
~~~
(3)通過Document對象獲取根節點
~~~
Element bookstore = document.getRootElement();
~~~
(4)通過Element對象的elementIterator方法獲取迭代器
~~~
Iterator iterator = bookstore.elementIterator();
~~~
(5)遍歷迭代器獲取根節點的信息
~~~
while (iterator.hasNext()) {
// 獲取下一個子節點
Element book = (Element)iterator.next();
}
~~~
(6)獲取屬性節點的屬性名稱和屬性值
~~~
// 獲取book的屬性節點集合
List<Attribute> bookAttr = book.attributes();
// 遍歷book屬性節點
for (Attribute attribute : bookAttr) {
// 獲取book的屬性節點的屬性名稱以及屬性值
System.out.println("name:" + attribute.getName() + " value:" + attribute.getValue());
}//for
~~~
(7)獲取元素節點的節點名稱和對應的文本值
~~~
Iterator ite = book.elementIterator();
// 遍歷book節點的子節點
while(ite.hasNext()){
// book節點的子節點
Element bookChild = (Element)ite.next();
System.out.println("name:" + bookChild.getName() + " value:" + bookChild.getStringValue());
//System.out.println("name:" + bookChild.getName() + " value:" + bookChild.getText());
}//while
~~~
2.3 具體案例
~~~
package com.qunar.xml;
import java.io.File;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class DOM4JXMLCode {
public static void main(String[] args) {
try {
// 創建SAXReader對象
SAXReader saxReader = new SAXReader();
// 通過SaxReader對象的read方法加載XML文檔獲取Document對象
Document document = saxReader.read(new File("D:\\bookstore.xml"));
// 通過Document對象獲取根節點
Element bookstore = document.getRootElement();
// 通過Element對象的elementIterator方法獲取迭代器
Iterator iterator = bookstore.elementIterator();
// 遍歷根節點的子節點
while (iterator.hasNext()) {
System.out.println("開始解析一本書...");
// 獲取下一個元素節點
Element book = (Element)iterator.next();
// 獲取book的屬性節點集合
List<Attribute> bookAttr = book.attributes();
// 遍歷book屬性節點
for (Attribute attribute : bookAttr) {
// 獲取book的屬性節點的屬性名稱以及屬性值
System.out.println("name:" + attribute.getName() + " value:" + attribute.getValue());
}//for
Iterator ite = book.elementIterator();
// 遍歷book節點的子節點
while(ite.hasNext()){
// book節點的子節點
Element bookChild = (Element)ite.next();
System.out.println("name:" + bookChild.getName() + " value:" + bookChild.getStringValue());
//System.out.println("name:" + bookChild.getName() + " value:" + bookChild.getText());
}//while
System.out.println("結束解析一本書...");
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
~~~
**運行結果:**
<table cellspacing="0" cellpadding="0" style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:942px"><tbody><tr><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:941px"><br/><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">開始解析一本書...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">name:category???value:Java</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">name:title???value:Java多線程編程核心技術</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">name:author???value:高洪巖</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">name:year???value:2015</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">name:price???value:69.00</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">結束解析一本書...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">開始解析一本書...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">name:category???value:C++</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">name:title???value:Effective?C++:?55?Specific?Ways?to?Improve?Your?Programs?and?Designs</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">name:author???value:Scott?Meyers</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">name:year???value:2006</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">name:price???value:58.00</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">結束解析一本書...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">開始解析一本書...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">name:category???value:Web</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">name:title???value:Learning?XML</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">name:author???value:Erik?T.?Ray</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">name:year???value:2016</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">name:price???value:39.95</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">結束解析一本書...</span></div></td></tr></tbody></table>
- 前言
- [Hibernate開發之路](1)Hibernate配置
- [Hibernate開發之路](2)Hibernate問題
- [Hibernate開發之路](3)基礎配置
- [Hibernate開發之路](4)ID生成策略
- [Hibernate開發之路](5)聯合主鍵
- [設計模式實踐之路](1)單例模式
- [Java]UDP通信的簡單例子
- [Java]套接字地址InetAddress講解
- [Java開發之路](1)final關鍵字
- [Java開發之路](2)Java字符串
- [Java開發之路](3)Java常用類
- [Java開發之路](4)String、StringBuffer與StringBuilder詳解
- [Java開發之路](5)異常詳解
- [Java開發之路](6)File類的使用
- [Java開發之路](7)RandomAccessFile類詳解
- [Java開發之路](8)輸入流和輸出流
- [Java開發之路](9)對象序列化與反序列化
- [Java開發之路](10)DOM解析XML文檔
- [Java開發之路](11)SAX解析XML文檔
- [Java開發之路](12)JDOM和DOM4J解析XML文檔
- [Java開發之路](14)反射機制
- [Java開發之路](15)注解
- [Java開發之路](16)學習log4j日志
- [Java開發之路](18)關于Class.getResource和ClassLoader.getResource的路徑問題
- [Java開發之路](19)Long緩存問題
- [Java開發之路](20)try-with-resource 異常聲明
- [Java開發之路](21)Comparator與Comparable
- [Java]Java工程師成神之路
- [細說Java](1)圖說字符串的不變性
- [細說Java](2)Java中字符串為什么是不可變的
- [細說Java](3)創建字符串是使用&quot; &quot;還是構造函數?