1. 程式人生 > >JAVA如何使用Dom4j解析xml的DEMO案例

JAVA如何使用Dom4j解析xml的DEMO案例

首先匯入Dom4J的jar包(密碼:kjv8)

打印出xml檔案中地產公司的id,名稱和地址

demo01.xml

<?xml version="1.0" encoding="UTF-8"?>
<companys>
    <company id="1001">
        <name>萬科A</name>
        <address>廣東深圳</address>
    </company>
    <company id="1002">
        <name>恆大B</name
>
<address>廣東廣州</address> </company> <company id="1003"> <name>金地C</name> <address>北京</address> </company> <company id="1006"> <name>綠地D</name> <address>上海</address> </company
>
</companys>

Company類

import java.io.Serializable;

public class Company implements Serializable{
    private static final long serialVersionUID = 1L;
    private Integer id;
    private String name;
    private String address;

    public Company() {}
    public Company(String name, String address) {
        this
.name = name; this.address = address; } public Company(Integer id, String name, String address) { this.id = id; this.name = name; this.address = address; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Company other = (Company) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } @Override public String toString() { return "Company [id=" + id + ", name=" + name + ", address=" + address + "]\n\r"; } }

DOM4J解析XML檔案

import java.io.InputStream;
import java.util.Iterator;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * DOM4J解析XML檔案
 */
public class XMLDemo1 {

    public static void main(String[] args) throws DocumentException{
        /** 1.建立一個讀取XML檔案的物件 用來指向XML檔案的輸入流
         *  這個XML檔案其實就是磁碟上的一個物理檔案,我需要將它變成JAVA的物件
         *  我們知道JAVA的物件是存在記憶體中的,所以我們就是要將物理的磁碟上的資料拿到記憶體中
         *  那麼首先我們是要將檔案的內容拿到記憶體中,然後再記憶體中進行處理
         */
        SAXReader reader = new SAXReader();

        /**
         * 2.建立一個(當前專案類路徑下的)輸入流 指向這個XML檔案
         * 因為它不是直接將檔案內容拿到記憶體裡,而是通過讀取流,所以要先建立一個輸入流
         * 語法:
         * InputStream 引用名 = 類名.class.getClassLoader().getResourceAsStream("檔名");
         */
        InputStream is = 
                XMLDemo1.class.getClassLoader().getResourceAsStream("demo01.xml");
        /**
         *3.我們通過SAXReader這個物件利用流來讀取這個物件 通過這個方法我們就把所有的XML資料拿到記憶體裡了 返回了一個文件型別的物件
         * 通過reader下的物件呼叫read()方法,並且將InputStream物件傳進去
         * 注意:導包的時候匯入import org.dom4j.Document;包
         */
         Document doc = reader.read(is); 

         /**
          * 拿到XML的內容之後,首先我們要讀取xml的根元素,再通過根元素讀取子元素,再讀取元素點裡面的值
          */
         /**
          * 4.獲取根元素 
          * 注意:導包的時候匯入import org.dom4j.Element;
          */
         Element root = doc.getRootElement();
         //System.out.println(root.getName()); //獲取根元素的名字 companys

        /**
         * 5.通過根元素獲取子元素的迭代器
         * 匯入:
         * import java.util.Iterator;包
         * import org.dom4j.Attribute;包
         */
         Iterator<Element> it = root.elementIterator();
         while(it.hasNext()){
             Element e = it.next();//獲取子元素
             //System.out.println(e.getName());

             // 獲取屬性值:方法一: 通過元素物件獲取元素屬性值
             //String id = e.attributeValue("id"); //獲取屬性id的值 注意在XML中拿到的所有資料都是String型別
             // System.out.println(id);
             // 獲取元素的屬性 方法二
             Attribute idAttr = e.attribute("id");
             String id = idAttr.getValue();
             //System.out.println(id);

             //通過元素物件獲取子元素物件
             Element nameElement = e.element("name");
             //獲取元素中的文字內容
             String name = nameElement.getText();
             //System.out.println(name); //萬科A恆大B金地C招商D
             //獲取公司地址
             Element addressElement = e.element("address");
             String address = addressElement.getText();
             System.out.println(address);


             //封裝物件
             Company company = new Company();
             company.setId(Integer.parseInt(id));
             company.setName(name);
             company.setAddress(address);
             System.out.println(company); 
             /**
              * Company [id=1001, name=萬科A, address=廣東深圳]
              * Company [id=1002, name=恆大B, address=廣東廣州]
              * Company [id=1003, name=金地C, address=北京]
              * Company [id=1006, name=綠地D, address=上海]
              */
         }   
    }
}

XPath應用解析xml檔案,XPath應用和Dom4j是一個整體,實際上它是Dom4j裡面的一個工具。
首先匯入jaxen-1.1-beta-7.jar的jar包(密碼:kjv8)
XPath是一門在XML文件中快速查詢資訊的語言。
單純使用dom訪問節點時,需要一層一層的處理。如果有了XPath,定位節點將變得很輕鬆,可以根據路徑表示式快速檢索元素、屬性。

     XPath應用通過路徑的寫法
       / :從根路徑查詢    "/companys/company/name"
       //:從當前元素直接獲取匹配的元素 "//name"
       ..:查詢當前元素的父元素   ".."
       . :查詢當前元素
       @ :查詢當前元素的屬性   "//company//@id"
import java.io.InputStream;
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;

/**
 * 
 * DOM4J解析XML   XPath應用
 * 
 */
public class XMLDemo2 {

    public static void main(String[] args) throws DocumentException {
        //1、 建立一個讀取XML檔案的物件  用來讀取指向XML檔案的輸入流
        SAXReader reader = new SAXReader();     
        //2、建立一個輸入流
        InputStream is = 
                XMLDemo2.class.getClassLoader().getResourceAsStream("demo01.xml");
        //3、獲取當前XML文件物件
        Document doc = reader.read(is);
        Element root = doc.getRootElement();

        //根據"/"路徑獲取元素
        List<Element> list = root.selectNodes("/companys/company/name");
        System.out.println(list.size());
        for (Element element : list) {
            System.out.println("name元素的值是:"+element.getText());
        }       
        //根據"//"路徑獲取元素
        List<Element> list1 = root.selectNodes("//name");
        System.out.println(list1.size());
        for (Element element : list1) {
            System.out.println("name元素的值是:"+element.getText());
            /**
             * name元素的值是:萬科A
               name元素的值是:恆大B
               name元素的值是:金地C
               name元素的值是:綠地D
             */
        }       
        //根據 ".."獲取父元素,根據 "."獲取當前元素,
        Element companyEle = root.element("company");
        //System.out.println(companyEle.attributeValue("id"));
        Element fat = (Element) companyEle.selectSingleNode("..");//Node
        //Element fat = (Element) companyEle.selectSingleNode(".");//Node
        System.out.println("父節點"+fat.getName());//companys  
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
        //根據"@"獲取屬性
        List<Attribute> list2 = root.selectNodes("//company//@id");
        System.out.println(list2.size()); //4
        for (Attribute attribute : list2) {
            System.out.print(attribute.getValue()+" ");//1001 1002 1003 1006 
        }
    }
}