www.MyException.Cn 網友分享於:2015-06-14 瀏覽:0次java
詳解xml文件描述,讀取方法以及將對象存放到xml文檔中,並按照指定的特徵尋找的方案dom
主要的幾個功能:性能
1.完成多條Emp信息的XML描述
2.讀取XML文檔解析Emp信息
測試
1 完成多條Emp信息的XML描述this
1.1 問題spa
現有多條Emp信息數據,如表-1所示:.net
表- 1 Emp信息數據開放源代碼
表-1中,每一行數據表示一條Emp信息。要求完成表-1中Emp信息數據的XML描述。3d
1.2 步驟xml
實現此案例須要按照以下步驟進行。
步驟一:建立XML文件
首先,建立名爲EmpList.xml的XML文件;而後,在該文件中使用處理指令設置屬性version以及屬性encoding的值,代碼以下所示:
<?xml version="1.0" encoding="UTF-8"?>
步驟二:肯定根元素
XML要求必須有根元素,所謂根元素就是不被其它元素包圍,而且根元素只能有一個。本案例使用<list>做爲根元素,表示該元素內能夠包含多條子元素做爲Emp信息數據,代碼以下所示:
<?xml version="1.0" encoding="UTF-8"?> <list> </list>
注意,在該文檔中,不能再定義與list平級的XML元素。
步驟三:定義表示Emp信息數據的元素
首先,在根元素 <list> 下,定義一個子元素 <emp></emp>,用於表示一條Emp信息,代碼以下所示:
<?xml version="1.0" encoding="UTF-8"?> <list> <emp> </emp> </list>
步驟四:爲 <emp> 元素定義 id 屬性
爲元素 <emp> 定義屬性id,用於表示Emp信息數據中的id,代碼以下所示:
<?xml version="1.0" encoding="UTF-8"?> <list> <emp id="1"> </emp> </list>
步驟五:爲 <emp> 元素定義子元素
爲元素 <emp> 定義子元素 <name>、<age>、<gender> 和 <salary>,分別表示Emp信息數據中的name、age、gender以及salary。併爲這四個子元素添加文本信息,以記載 Emp 的相關信息數據,代碼以下所示:
<?xml version="1.0" encoding="UTF-8"?> <list> <emp id="1"> <name>張三</name> <age>34</age> <gender>男</gender> <salary>3000</salary> </emp> </list>
步驟六:實現多條Emp信息數據的XML描述
一個 <emp> 元素表示一條 Emp 數據,所以,能夠用多個 <emp> 元素來描述剩餘的多條Emp信息數據。代碼以下所示:
<?xml version="1.0" encoding="UTF-8"?> <list> <emp id="1"> <name>張三</name> <age>34</age> <gender>男</gender> <salary>3000</salary> </emp> <emp id="2"> <name>李四</name> <age>21</age> <gender>女</gender> <salary>4000</salary> </emp> <emp id="3"> <name>王五</name> <age>46</age> <gender>女</gender> <salary>6500</salary> </emp> <emp id="4"> <name>趙六</name> <age>28</age> <gender>男</gender> <salary>4400</salary> </emp> <emp id="5"> <name>錢七</name> <age>53</age> <gender>男</gender> <salary>12000</salary> </emp> </list>
1.3 完整代碼
本案例中,EmpList.xml文件的完整內容以下所示:
<?xml version="1.0" encoding="UTF-8"?> <list> <emp id="1"> <name>張三</name> <age>34</age> <gender>男</gender> <salary>3000</salary> </emp> <emp id="2"> <name>李四</name> <age>21</age> <gender>女</gender> <salary>4000</salary> </emp> <emp id="3"> <name>王五</name> <age>46</age> <gender>女</gender> <salary>6500</salary> </emp> <emp id="4"> <name>趙六</name> <age>28</age> <gender>男</gender> <salary>4400</salary> </emp> <emp id="5"> <name>錢七</name> <age>53</age> <gender>男</gender> <salary>12000</salary> </emp> </list>
2 讀取XML文檔解析Emp信息
2.1 問題
解析上一案例中建立的XML文檔EmpList.xml。首先,將每個<emp>節點中的屬性和子元素封裝爲一個Emp對象;而後,將Emp對象存儲到List集合中並輸出到控制檯。
封裝emp對象的代碼:
package com.souvc.xml; public class Emp { private int id; private String name; private int age; private String gender; // private String element; private double salary; public Emp() { } public Emp(int id, String name, int age, String gender, double salary) { super(); this.id = id; this.name = name; this.age = age; this.gender = gender; this.salary = salary; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } public String toString() { return "id=" + id + ",name=" + name + ",age=" + age + ",gender=" + gender + ",salary=" + salary; } }
2.2 方案
dom4j是一個Java的XML API,用來讀寫XML文件。dom4j是一個很是優秀的Java XML API,具備性能優異、功能強大和極端易用的特色,同時它也是一個開放源代碼的軟件。使用dom4j來實現對XML文檔的解析,詳細過程以下:
1)使用dom4j須要導入dom4j對應的jar包。
dom4j,jaxen 官網下載頁面: http://sourceforge.net/projects/dom4j/files/dom4j-2.0.0-ALPHA-2/
也能夠在網盤上面下載:http://yunpan.cn/cwaNde7UYN83d 提取碼 e247
2)建立SAXReader類的對象來實現讀取XML文檔,代碼以下:
SAXReader reader = new SAXReader();
3)使用SAXReader類的read方法獲取Document對象,Document 對象是一棵文檔樹的根,可爲咱們提供對文檔數據的最初(或最頂層)的訪問入口,代碼以下:
Document doc = reader.read(new File("EmpList.xml"));
4)使用Document對象的getRootElement方法獲取要解析的XML文檔的根元素,該方法返回值類型爲Element。 Element 對象表示 XML文檔中的元素。元素可包含屬性、其它元素或文本。若是元素含有文本,則在文本節點中表示該文本,代碼以下:
Element root = doc.getRootElement();
5)接下來,可使用Element對象提供的方法繼續解析XML文檔,例如:其elements方法用來獲取當前元素下的全部子元素,代碼以下:
List<Element> elements = root.elements();
2.3 步驟
實現此案例須要按照以下步驟進行。
步驟一:導入dom4j對應的jar包
在當前工程下導入dom4j對應的jar包。
dom4j,jaxen 官網下載頁面: http://sourceforge.net/projects/dom4j/files/dom4j-2.0.0-ALPHA-2/
也能夠在網盤上面下載:http://yunpan.cn/cwaNde7UYN83d 提取碼 e247
而且把EmpList.xml 文件放到工程目錄下面,方便讀取。
步驟二:新建類及測試方法
首先,新建類TestDom;而後在該類中新建測試方法testReadXml,代碼以下所示:
import org.junit.Test; public class TestDom { /** * 使用DOM解析XML文件 */ @Test public void testReadXml() { }
步驟三:建立SAXReader類的對象,獲取Document對象
建立SAXReader類的對象來實現讀取XML文檔;而後,使用SAXReader類的read方法獲取Document對象,代碼以下所示:
import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.junit.Test; public class TestDom { /** * 使用DOM解析XML文件 */ @Test public void testReadXml() { try { // 建立SAXReader SAXReader reader = new SAXReader(); // 讀取指定文件 Document doc = reader.read(new File("EmpList.xml")); } catch (Exception e) { e.printStackTrace(); } } }
步驟四:獲取根元素
使用Document對象的getRootElement方法獲取EmpList.xml文檔的根元素,代碼以下所示:
import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.junit.Test; public class TestDom { /** * 使用DOM解析XML文件 */ @Test public void testReadXml() { try { // 建立SAXReader SAXReader reader = new SAXReader(); // 讀取指定文件 Document doc = reader.read(new File("EmpList.xml")); // 獲取根節點list Element root = doc.getRootElement(); } catch (Exception e) { e.printStackTrace(); } } }
步驟五:獲取<list>節點下的全部子元素
使用Element對象的elements方法獲取<list>節點下的全部子元素,即全部的<emp>節點,代碼以下所示:
import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.junit.Test; public class TestDom { /** * 使用DOM解析XML文件 */ @Test public void testReadXml() { try { // 建立SAXReader SAXReader reader = new SAXReader(); // 讀取指定文件 Document doc = reader.read(new File("EmpList.xml")); // 獲取根節點list Element root = doc.getRootElement(); // 獲取list下的全部子節點emp List<Element> elements = root.elements(); } catch (Exception e) { e.printStackTrace(); } } }
步驟六:封裝Emp對象,存儲到List集合中
1)建立存儲的數據類型爲Emp類型的List集合emps;
2)循環上一步中的elements集合,每循環一次獲取一個emp元素。在循環中使用Element對象的attribute方法獲取id 屬性對應的Attribute對象,再使用Attribute對象的getValue方法就能夠獲取到屬性id對應的文本信息,即Emp對象的屬性id的 信息;
3)在循環中,使用Element對象的elementText方法獲取節 點<name>、<age>、<gender>以及<salary>對應的文本信息,即Emp對象的屬 性name、age、gender以及salary。
4)在循環中,將上述獲取到的信息封裝爲Emp對象,存儲到集合emps中。
代碼以下所示:
import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.junit.Test; public class TestDom { /** * 使用DOM解析XML文件 */ @Test public void testReadXml() { try { // 建立SAXReader SAXReader reader = new SAXReader(); // 讀取指定文件 Document doc = reader.read(new File("EmpList.xml")); // 獲取根節點list Element root = doc.getRootElement(); // 獲取list下的全部子節點emp List<Element> elements = root.elements(); // 保存全部員工對象的集合 List<Emp> emps = new ArrayList<Emp>(); for (Element element : elements) { int id = Integer.parseInt(element.attribute("id").getValue()); String name = element.elementText("name"); int age = Integer.parseInt(element.elementText("age")); String gender = element.elementText("gender"); double salary = Double.parseDouble(element .elementText("salary")); Emp emp = new Emp(id, name, age, gender, salary); emps.add(emp); } } catch (Exception e) { e.printStackTrace(); } } }
步驟七:輸出集合
將emps集合的信息輸出到控制檯,代碼以下所示:
import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.junit.Test; public class TestDom { /** * 使用DOM解析XML文件 */ @Test public void testReadXml() { try { // 建立SAXReader SAXReader reader = new SAXReader(); // 讀取指定文件 Document doc = reader.read(new File("EmpList.xml")); // 獲取根節點list Element root = doc.getRootElement(); // 獲取list下的全部子節點emp List<Element> elements = root.elements(); // 保存全部員工對象的集合 List<Emp> emps = new ArrayList<Emp>(); for (Element element : elements) { int id = Integer.parseInt(element.attribute("id").getValue()); String name = element.elementText("name"); int age = Integer.parseInt(element.elementText("age")); String gender = element.elementText("gender"); double salary = Double.parseDouble(element .elementText("salary")); Emp emp = new Emp(id, name, age, gender, salary); emps.add(emp); } System.out.println("解析完畢"); System.out.println(emps); } catch (Exception e) { e.printStackTrace(); } } }
步驟八:運行
運行testReadXml方法,控制檯輸出結果以下所示:
解析完畢
解析完畢 [id=1,name=張三,age=34,gender=男,salary=3000.0, id=2,name=李四,age=21,gender=女,salary=4000.0, id=3,name=王五,age=46,gender=女,salary=6500.0, id=4,name=趙六,age=28,gender=男,salary=4400.0, id=5,name=錢七,age=53,gender=男,salary=12000.0]
從輸出結果能夠看出,已經對EmpList.xml文檔進行解析,將每個<emp>節點中的屬性和子元素封裝爲一個Emp對象並將Emp對象存儲到List集合中。
2.4 完整代碼
本案例中,類TestDom的完整代碼以下所示:
import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.junit.Test; public class TestDom { /** * 使用DOM解析XML文件 */ public void testReadXml() { try { // 建立SAXReader SAXReader reader = new SAXReader(); // 讀取指定文件 Document doc = reader.read(new File("EmpList.xml")); // 獲取根節點list Element root = doc.getRootElement(); // 獲取list下的全部子節點emp List<Element> elements = root.elements(); // 保存全部員工對象的集合 List<Emp> emps = new ArrayList<Emp>(); for (Element element : elements) { int id = Integer.parseInt(element.attribute("id").getValue()); String name = element.elementText("name"); int age = Integer.parseInt(element.elementText("age")); String gender = element.elementText("gender"); double salary = Double.parseDouble(element .elementText("salary")); Emp emp = new Emp(id, name, age, gender, salary); emps.add(emp); } System.out.println("解析完畢"); System.out.println(emps); } catch (Exception e) { e.printStackTrace(); } } }
3 將Emp(存放在List中)對象轉換爲XML文檔
3.1 問題
在List集合中存儲了以下數據:
List<Emp> emps = new ArrayList<Emp>(); emps.add(new Emp(1, "張三", 33, "男", 9000)); emps.add(new Emp(2, "李四", 26, "男", 5000)); emps.add(new Emp(3, "王五", 48, "男", 34000));
請將集合emps中的全部Emp對象轉換爲XML文件的形式。
3.2 方案
使用dom4j創建XML文檔的過程以下:
1)建立文檔對象,代碼以下:
Document doc = DocumentHelper.createDocument();
2)建立根節點,代碼以下:
Element root = doc.addElement("list");
3)在節點下添加註釋、屬性、子節點,Element提供以下方法:
addComment:方法添加註釋 addAttribute:添加屬性 addElement:添加子元素
4)經過XMLWriter 生成物理文件。
3.3 步驟
實現此案例須要按照以下步驟進行。
步驟一:添加測試方法testWriteXml
首先在TestDom類中新建測試方法testWriteXml;而後在該測試方法中,添加List集合存儲Emp對象的代碼,代碼以下所示:
import java.util.ArrayList; import java.util.List; import org.junit.Test; public class TestDom { /** * 測試寫xml */ @Test public void testWriteXml() { List<Emp> emps = new ArrayList<Emp>(); emps.add(new Emp(1, "張三", 33, "男", 9000)); emps.add(new Emp(2, "李四", 26, "男", 5000)); emps.add(new Emp(3, "王五", 48, "男", 34000)); } }
步驟二:建立文檔對象
使用DocumentHelper類的靜態方法createDocument建立文檔對象Document,代碼以下所示:
import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.junit.Test; public class TestDom { /** * 測試寫xml */ @Test public void testWriteXml() { List<Emp> emps = new ArrayList<Emp>(); emps.add(new Emp(1, "張三", 33, "男", 9000)); emps.add(new Emp(2, "李四", 26, "男", 5000)); emps.add(new Emp(3, "王五", 48, "男", 34000)); try { Document doc = DocumentHelper.createDocument(); } catch (Exception e) { e.printStackTrace(); } }
步驟三:建立根節點
使用Document類的addElement方法,建立根節點<list>,代碼以下所示:
import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.junit.Test; public class TestDom { /** * 測試寫xml */ @Test public void testWriteXml() { List<Emp> emps = new ArrayList<Emp>(); emps.add(new Emp(1, "張三", 33, "男", 9000)); emps.add(new Emp(2, "李四", 26, "男", 5000)); emps.add(new Emp(3, "王五", 48, "男", 34000)); try { Document doc = DocumentHelper.createDocument(); // 添加根標記 Element root = doc.addElement("list"); } catch (Exception e) { e.printStackTrace(); } }
步驟四:添加子元素
首先,循環集合emps,在循環中獲取Emp對象的信息;而後,在循環中使用Element類的addAttribute方法在該元素下添加 屬性,屬性的值爲對應Emp對象中的成員變量的值;使用addElement方法在該元素下添加子元素;使用addText方法爲該子元素添加文本,該文 本也爲對應Emp對象中成員變量的值,代碼以下所示:
import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.junit.Test; public class TestDom { /** * 測試寫xml */ @Test public void testWriteXml() { List<Emp> emps = new ArrayList<Emp>(); emps.add(new Emp(1, "張三", 33, "男", 9000)); emps.add(new Emp(2, "李四", 26, "男", 5000)); emps.add(new Emp(3, "王五", 48, "男", 34000)); try { Document doc = DocumentHelper.createDocument(); // 添加根標記 Element root = doc.addElement("list"); for (Emp emp : emps) { // 向根元素中添加名爲emp的子元素 Element ele = root.addElement("emp"); // 爲emp元素添加屬性id,其值爲cp ele.addAttribute("id", emp.getId() + ""); ele.addElement("name").addText(emp.getName()); ele.addElement("age").addText(emp.getAge() + ""); ele.addElement("gender").addText(emp.getGender()); ele.addElement("salary").addText(emp.getSalary() + ""); } } catch (Exception e) { e.printStackTrace(); } }
步驟五:生成物理文件
經過XMLWriter 生成物理文件,代碼以下所示:
import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.junit.Test; public class TestDom { /** * 測試寫xml */ @Test public void testWriteXml() { List<Emp> emps = new ArrayList<Emp>(); emps.add(new Emp(1, "張三", 33, "男", 9000)); emps.add(new Emp(2, "李四", 26, "男", 5000)); emps.add(new Emp(3, "王五", 48, "男", 34000)); try { Document doc = DocumentHelper.createDocument(); // 添加根標記 Element root = doc.addElement("list"); for (Emp emp : emps) { // 向根元素中添加名爲emp的子元素 Element ele = root.addElement("emp"); // 爲emp元素添加屬性id ele.addAttribute("id", emp.getId() + ""); ele.addElement("name").addText(emp.getName()); ele.addElement("age").addText(emp.getAge() + ""); ele.addElement("gender").addText(emp.getGender()); ele.addElement("salary").addText(emp.getSalary() + ""); } // 寫出 XMLWriter writer = new XMLWriter(); FileOutputStream fos = new FileOutputStream("emps.xml"); writer.setOutputStream(fos); writer.write(doc); writer.close(); } catch (Exception e) { e.printStackTrace(); } }
步驟六:運行
運行testWriteXml方法,會在當前工程目錄下生成emps.xml文件,該文件中的內容以下:
<?xml version="1.0" encoding="UTF-8"?> <list> <emp id="1"> <name>張三</name> <age>33</age> <gender>男</gender> <salary>9000.0</salary> </emp> <emp id="2"> <name>李四</name> <age>26</age> <gender>男</gender> <salary>5000.0</salary> </emp> <emp id="3"> <name>王五</name> <age>48</age> <gender>男</gender> <salary>34000.0</salary> </emp> </list>
3.4 完整代碼
本案例的完整代碼以下所示:
package com.souvc.xml; import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.junit.Test; public class TestDom { /** * 使用DOM解析XML文件 */ @Test public void testReadXml() { try { // 建立SAXReader SAXReader reader = new SAXReader(); // 讀取指定文件 Document doc = reader.read(new File("EmpList.xml")); // 獲取根節點list Element root = doc.getRootElement(); // 獲取list下的全部子節點emp List<Element> elements = root.elements(); // 保存全部員工對象的集合 List<Emp> emps = new ArrayList<Emp>(); for (Element element : elements) { int id = Integer.parseInt(element.attribute("id").getValue()); String name = element.elementText("name"); int age = Integer.parseInt(element.elementText("age")); String gender = element.elementText("gender"); double salary = Double.parseDouble(element .elementText("salary")); Emp emp = new Emp(id, name, age, gender, salary); emps.add(emp); } System.out.println("解析完畢"); System.out.println(emps); } catch (Exception e) { e.printStackTrace(); } } /** * * 測試寫xml * */ @Test public void testWriteXml() { List<Emp> emps = new ArrayList<Emp>(); emps.add(new Emp(1, "張三", 33, "男", 9000)); emps.add(new Emp(2, "李四", 26, "男", 5000)); emps.add(new Emp(3, "王五", 48, "男", 34000)); try { Document doc = DocumentHelper.createDocument(); // 添加根標記 Element root = doc.addElement("list"); for (Emp emp : emps) { // 向根元素中添加名爲emp的子元素 Element ele = root.addElement("emp"); // 爲emp元素添加屬性id,其值爲cp ele.addAttribute("id", emp.getId() + ""); ele.addElement("name").addText(emp.getName()); ele.addElement("age").addText(emp.getAge() + ""); ele.addElement("gender").addText(emp.getGender()); ele.addElement("salary").addText(emp.getSalary() + ""); } // 寫出 XMLWriter writer = new XMLWriter(); FileOutputStream fos = new FileOutputStream("emps.xml"); writer.setOutputStream(fos); writer.write(doc); System.out.println("生成文檔完畢!"); writer.close(); } catch (Exception e) { e.printStackTrace(); } } }
4 在XML文檔中查找指定特徵的Emp信息
4.1 問題
在上一案例中,咱們建立了emps.xml文件,本案例要求查找該文件中屬性id的值爲2的<emp>節點,並讀取該節點下子節點<name>的文本信息。另外,要求使用XPath來實現。
4.2 方案
XPath 是一門在 XML 文檔中查找信息的語言。XPath 可用來在 XML 文檔中對元素和屬性進行遍歷。咱們使用DOM定位節點時,大部分時間須要一層一層的處理,若是有了XPath,咱們定位節點將變得很輕鬆。它能夠根據路 徑,屬性,甚至是條件進行節點的檢索。例如本案例中,檢索屬性id的值爲2的<emp>節點,則可使用以下路徑表達式:
/list/emp[@id='2']
上述表達式中還使用謂語條件。所謂"謂語條件",就是對路徑表達式的附加條件。全部的條件,都寫在方括號"[]"中,表示對節點進行進一步的篩選。
4.3 步驟
實現此案例須要按照以下步驟進行。
步驟一:新建測試方法
在TestDom類中新建測試方法findId,代碼以下所示:
import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.junit.Test; public class TestDom { /** * 使用XPath查找指定信息 */ @Test public void findId() { } }
步驟二:建立SAXReader類的對象,獲取Document對象
首先,建立SAXReader類的對象來實現讀取XML文檔;而後,使用SAXReader類的read方法獲取Document對象,代碼以下所示:
import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.junit.Test; public class TestDom { /** * 使用XPath查找指定信息 */ @Test public void findId() { try { // 建立SAXReader SAXReader reader = new SAXReader(); // 讀取指定文件 Document doc = reader.read(new File("emps.xml")); } catch (Exception e) { e.printStackTrace(); } } }
步驟三: 使用XPath和謂語條件查找節點
使用Element對象的selectNodes方法,獲取XPath和謂語條件爲「/list/emp[@id='2']」的全部元素,即查找到全部id爲2的emp元素,代碼以下所示:
import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.junit.Test; public class TestDom { /** * 使用XPath查找指定信息 */ @Test public void findId() { try { // 建立SAXReader SAXReader reader = new SAXReader(); // 讀取指定文件 Document doc = reader.read(new File("emps.xml")); // 查找id爲2的用戶信息 List list = doc.selectNodes("/list/emp[@id='2']"); System.out.println("選取了:" + list.size() + "條數據"); } catch (Exception e) { e.printStackTrace(); } } }
步驟四: 獲取<emp>節點下<name>子節點的文本信息
循環遍歷上一步獲得的list集合,在循環中使用Element對象的elementText方法獲取<emp>節點下<name>子節點的文本信息,代碼以下所示:
import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.junit.Test; public class TestDom { /** * 使用XPath查找指定信息 */ @Test public void findId() { try { // 建立SAXReader SAXReader reader = new SAXReader(); // 讀取指定文件 Document doc = reader.read(new File("emps.xml")); // 查找id爲1的用戶信息 List list = doc.selectNodes("/list/emp[@id='2']"); System.out.println("選取了:" + list.size() + "條數據"); for (Object o : list) { Element e = (Element) o; System.out.println("name:" + e.elementText("name")); } } catch (Exception e) { e.printStackTrace(); } } }
步驟五:運行
運行findId方法,控制檯輸出結果以下:
選取了:1條數據 name:李四
從輸出結果能夠看出,已經查找到了emps.xml文件中屬性id的值爲2的<emp>節點,並讀取了該節點下子節點<name>的文本信息。
4.4 完整代碼
本案例的完整代碼以下所示:
package com.souvc.xml; import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.junit.Test; public class TestDom { /** * 使用DOM解析XML文件 */ @Test public void testReadXml() { try { // 建立SAXReader SAXReader reader = new SAXReader(); // 讀取指定文件 Document doc = reader.read(new File("EmpList.xml")); // 獲取根節點list Element root = doc.getRootElement(); // 獲取list下的全部子節點emp List<Element> elements = root.elements(); // 保存全部員工對象的集合 List<Emp> emps = new ArrayList<Emp>(); for (Element element : elements) { int id = Integer.parseInt(element.attribute("id").getValue()); String name = element.elementText("name"); int age = Integer.parseInt(element.elementText("age")); String gender = element.elementText("gender"); double salary = Double.parseDouble(element .elementText("salary")); Emp emp = new Emp(id, name, age, gender, salary); emps.add(emp); } System.out.println("解析完畢"); System.out.println(emps); } catch (Exception e) { e.printStackTrace(); } } /** * * 測試寫xml * */ @Test public void testWriteXml() { List<Emp> emps = new ArrayList<Emp>(); emps.add(new Emp(1, "張三", 33, "男", 9000)); emps.add(new Emp(2, "李四", 26, "男", 5000)); emps.add(new Emp(3, "王五", 48, "男", 34000)); try { Document doc = DocumentHelper.createDocument(); // 添加根標記 Element root = doc.addElement("list"); for (Emp emp : emps) { // 向根元素中添加名爲emp的子元素 Element ele = root.addElement("emp"); // 爲emp元素添加屬性id,其值爲cp ele.addAttribute("id", emp.getId() + ""); ele.addElement("name").addText(emp.getName()); ele.addElement("age").addText(emp.getAge() + ""); ele.addElement("gender").addText(emp.getGender()); ele.addElement("salary").addText(emp.getSalary() + ""); } // 寫出 XMLWriter writer = new XMLWriter(); FileOutputStream fos = new FileOutputStream("emps.xml"); writer.setOutputStream(fos); writer.write(doc); System.out.println("生成文檔完畢!"); writer.close(); } catch (Exception e) { e.printStackTrace(); } } /** * * 使用XPath查找指定信息 * */ @Test public void findId() { try { // 建立SAXReader SAXReader reader = new SAXReader(); // 讀取指定文件 Document doc = reader.read(new File("emps.xml")); // 查找id爲2的用戶信息 List list = doc.selectNodes("/list/emp[@id='2']"); System.out.println("選取了:" + list.size() + "條數據"); for (Object o : list) { Element e = (Element) o; System.out.println("name:" + e.elementText("name")); } } catch (Exception e) { e.printStackTrace(); } } }