XML之dom4jjava
dom4j解析xml文檔的大體步驟node
第一步. 使用 org.dom4j.io.SAXReader 類的read(String fileName)方法讀取並解析xml文檔,返回org.dom4j.Document 接口的一個對象;dom
<!-- lang: java -->.net
// 實例化SAXReader對象,調用read()方法讀取XML文檔,返回XML文檔
SAXReader reader = new SAXReader();
Document doc = reader.read(new File(fileName));
第二步.取得根節點,返回org.dom4j.Element 接口的一個對象;xml
<!-- lang: java -->
//獲取ROOT(根)節點
Element root = doc.getRootElement();
第三步 . 遍歷XML樹(枚舉(Iterator)、遞歸 、Visitor模式),上面的代碼用了下面的方式實現。對象
<!-- lang: java -->遞歸
// 枚舉全部子節點
for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
Element el = (Element) i.next();
// do something
}
============ 結合上面的實例整理一些dom4j解析xml的經常使用API ===============接口
獲取子節點的兩種方法:element(String name)和elements(String name)ip
1 . 文檔中 price 、description 、calories 這三個標籤在根節點中的名稱都是惟一的,所以能夠用element();element
<!-- lang: java -->
//獲取<price> 、<description> 、<calories>節點
Element price = el.element("price");
Element calories = el.element("calories");
Element description = el.element("description");
2 . 而 name 標籤在根節點下並非惟一的,須要用elements(),而且用List接受
<!-- lang: java -->
//獲取全部<name>節點
List<Element> list = el.elements("name");
org.dom4j.Element接口下幾個經常使用方法;
1 . getName()方法,用於返回節點名稱。
<!-- lang: java -->
//取得<price>的節點名
Element price = el.element("price");
System.out.println("標籤名爲:"+price.getName()); //結果爲:price
2 . getText() 方法 ,用於返回節點值。
<!-- lang: java -->
//取得<price>的節點值
Element price = element.element("price");
System.out.println("該節點值爲:"+price.getText()); //第一次結果爲:$1.95
3 . attributes方法, 返回該元素的屬性列表
<!-- lang: java -->
//取得<calories unit="kCal">中的屬性列表,如有多個用get(i)依次獲取
Element calories = element.element("calories");
Attribute ca = (Attribute) calories.attributes().get(0); //取得第一個節點屬性
4 . attributeValue(String name) ,根據傳入的屬性名獲取屬性值
<!-- lang: java -->
//取得<calories unit="kCal">中的unti屬性的值
Element calories = element.element("calories");
System.out.println("屬性unit的值爲:"+calories.attributeValue("unit"));//結果爲:kCal
5 . getParent() , 返回一個父元素
<!-- lang: java -->
Element description = el.element("description");
System.out.println("該父元素爲:"+description.getParent().getName()); //結果爲food
org.dom4j.Attribute 接口下的兩個方法;
1 . getName() 獲取屬性名 getValue() 獲取屬性值
<!-- lang: java -->
//獲取<calories unit="kCal">中的屬性名和屬性對應的值
Element calories = el.element("calories ");
Attribute ca =(Attribute)calories.attributes().get(0);
System.out.println(ca.getName()+":"+ca.getValue()); 第一次結果爲:unit:kCal
例一XML:
<?xml version="1.0" encoding="GB2312"?>
<RESULT>
<VALUE>
<NO>A1234</NO>
<ADDR>四川省XX縣XX鎮XX路X段XX號</ADDR>
</VALUE>
<VALUE>
<NO>B1234</NO>
<ADDR>四川省XX市XX鄉XX村XX組</ADDR>
</VALUE>
</RESULT>
java:
package www.yq.com.src;
import java.io.File;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* @Project XMLSimpleTest
* @File MyDom4jXmlReader.java
* @Package www.yq.com.src
* @Date 2016年1月26日 上午11:52:01
* @Author
* @email
*/
public class MyDom4jXmlReader {
public static void main(String[] args) throws DocumentException {
File f = new File("E:\\qi.xml");
SAXReader reader = new SAXReader();
Document document = reader.read(f);
Element rootElement = document.getRootElement();
for (Iterator iterator = rootElement.elementIterator(); iterator.hasNext();) {
Element node = (Element) iterator.next();
System.out.println("車牌號:"+node.elementText("NO"));
System.out.println("車牌地址:"+node.elementText("ADDR"));
}
}
}
例二:
<!-- lang: xml -->
<?xml version="1.0" encoding="GBK"?>
<breakfast_menu>
<!--這是根節點-->
<food>
<name>hamburger</name>
<name>漢堡包</name>
<price currency="dollar">$1.95</price>
<description>A sandwich made with a patty bun......</description>
<calories unit="kCal">260</calories>
</food>
<food>
<name>Strawberry Belgian Waffles</name>
<name>華夫餅 </name>
<price currency="dollar">$7.95</price>
<description>light Belgian waffles covered...</description>
<calories unit="kCal">900</calories>
</food>
<food>
<name>Berry-Berry Belgian Waffles</name>
<name>不知道什麼鳥東西 </name>
<price currency="dollar">$8.95</price>
<description>爲了美觀描述就寫少點了 ......</description>
<calories unit="kCal">900</calories>
</food>
</breakfast_menu>
<!-- lang: java -->
import java.io.File;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Dom4jTest {
public static void main(String[] args) throws Exception {
// 從文件讀取XML,輸入文件名,返回XML文檔
File file = new File("E:"+File.separator+"001.xml");
SAXReader reader = new SAXReader();
Document doc = reader.read(file);
Element root = doc.getRootElement(); //獲取根節點
for (Iterator i = root.elementIterator(); i.hasNext(); ) {
Element el = (Element) i.next();
List<Element> list = el.elements("name");
System.out.println(list.get(0).getName()+":"+list.get(0).getText());
System.out.println(list.get(1).getName()+":"+list.get(1).getText());
Element price = el.element("price");
System.out.println("標籤名爲:"+price.getName());
System.out.println("該節點值爲:"+price.getText());
Element description = el.element("description");
System.out.println("該父元素爲:"+description.getParent().getName());
System.out.println(description.getNodeType());
Element calories = el.element("calories");
Attribute ca = (Attribute) calories.attributes().get(0); //取得節點屬性
System.out.println(ca.getName()+":"+ca.getValue());
System.out.println("屬性unit的值爲:"+calories.attributeValue("unit"));
System.out.println("========================="); } } }