JAVA如何使用Dom4j解析xml的DEMO案例
阿新 • • 發佈:2019-02-09
首先匯入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
}
}
}