使用dom4j解析XML文檔

用前一篇文章所建立的xml文檔來作試驗了,完整內容以下:java

<!-- 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>

首先要導入dom4j組件中的兩個包,一個是dom4j-1.6.1.jar文件,另外一個lib文件夾下的jaxen-1.1-beta-6.jar包。 java代碼,寫的亂,發現寫註釋會更亂dom

<!-- 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("=========================");
		}
    }
}

dom4j解析xml文檔的大體步驟code

第一步. 使用 org.dom4j.io.SAXReader 類的read(String fileName)方法讀取並解析xml文檔,返回org.dom4j.Document 接口的一個對象;xml

<!-- lang: java -->

                // 實例化SAXReader對象,調用read()方法讀取XML文檔,返回XML文檔
                SAXReader reader = new SAXReader();
                Document doc = reader.read(new File(fileName));

第二步.取得根節點,返回org.dom4j.Element 接口的一個對象;對象

<!-- 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


       
    ===================之後再補充======================
相關文章
相關標籤/搜索