首先項目裏添加2個jar包,jar包名如下:
dom4j-1.6.1.jar
jaxen-1.1.1.jar
emp.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>
myemp.xml
<?xml version="1.0" encoding="UTF-8"?>
<list>
<emp id="1">
<name>jack</name>
<age>33</age>
<gender>男</gender>
<salary>5000</salary>
</emp>
<emp id="2">
<name>boss</name>
<age>55</age>
<gender>男</gender>
<salary>55000</salary>
</emp>
<emp id="3">
<name>marry</name>
<age>22</age>
<gender>女</gender>
<salary>3500</salary>
</emp>
<emp id="4">
<name>kate</name>
<age>25</age>
<gender>女</gender>
<salary>6000</salary>
</emp>
<emp id="5">
<name>tom</name>
<age>32</age>
<gender>男</gender>
<salary>8500</salary>
</emp>
</list>
Emp.class
package day20150924;
/**
* 該類用於描述emp.xml文件中表示的員工
* 子類方法具備多態(假設Person和Son都有age屬性和run方法)
* Person p = new Son();
* p.run();//調用子類方法
* 屬性不具備多態
* p.age;//調用父類屬性
*/
public class Emp {
private int id;
private String name;
private int age;
private String gender;
private int salary;
public Emp(){}
public Emp(int id, String name, int age, String gender, int 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 int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
@Override
public String toString() {
return id+","+name+","+age+","+gender+","+salary;
}
}
package day20150924;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* 使用DOM解析XML文件
*/
public class XMLDemo1 {
public static void main(String[] args) {
try{
/*
* 解析XML文件的基本流程
* 1:創建SAXReader,用來讀取XML文件
* 2:指定XML文件使得SAXReader讀取,並解析文檔對象Document
* 3:獲取根元素
* 4:獲取每一個元素,從而達到解析的目的
*/
//1:創建SAXReader,用來讀取XML文件
SAXReader reader = new SAXReader();//帶Reader都是字符流
//2:指定XML文件使得SAXReader讀取,並解析文檔對象Document
File xmlFile = new File("emp.xml");
/*
* 常用的讀取方法:
* Document read(InputStream in)
* Document read(Reader read)
* Document read(File file)
* read方法的作用:
* 讀取給定的xml,並將其解析轉換爲一個Document對象,
* 實際上這裏已經完成了對整個xml的解析工作,
* 並將所有的內容封裝到了Document對象中。
* Document對象可以描述當前xml文檔
*/
Document doc = reader.read(xmlFile);
//3:獲取根元素,拿到list元素
Element root = doc.getRootElement();
//4 獲取每個元素
/*
* Element element(String name)
* 獲取當前標籤下的第一個給定名字的標籤
*
* List elements(String name)
* 獲取當前標籤下所有給定名字的標籤
*
* List elements()
* 獲取所有子標籤
*/
List<Element> elements = root.elements("emp");
/*
* 創建集合,保存xml中每個用戶的信息,然後創建Emp實例,
* 將信息設置到該實例的相應屬性上。
* 最終將所有emp對象存入該集合
*/
List<Emp> list = new ArrayList<Emp>();
/*
* 遍歷每個emp標籤
*/
for(Element emp : elements){
Emp e = new Emp();
//解析emp標籤
//獲取name的值
Element ename = emp.element("name");
//獲取前後標籤中的文本
String name = ename.getTextTrim();
//獲取年齡
/*
* String elementText(String name)
* 獲取當前標籤中給定名字的子標籤中間的文本
* 該方法與上面取得name的兩句話等效
*/
int age = Integer.parseInt(emp.elementText("age"));
String gender = emp.elementText("gender");
int salary = Integer.parseInt(emp.elementText("salary"));
e.setName(name);
e.setAge(age);
e.setGender(gender);
e.setSalary(salary);
//獲取id屬性
Attribute attr = emp.attribute("id");
/*
* Attribute表示一個屬性,常用方法:
* String getValue():獲取該屬性的值
* String getName():獲取該屬性的名字
*/
int id = Integer.parseInt(attr.getValue());
e.setId(id);
list.add(e);
}
System.out.println("解析了"+list.size()+"個員工信息");
for(Emp emp : list){
System.out.println(emp);
}
}catch(Exception e){
}
}
}
package day20150924;
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.XMLWriter;
/**
* 使用DOM寫出一個XML
*/
public class XMLDemo2 {
public static void main(String[] args) {
List<Emp> list = new ArrayList<Emp>();
list.add(new Emp(1,"jack",33,"男",5000));
list.add(new Emp(2,"boss",55,"男",55000));
list.add(new Emp(3,"marry",22,"女",3500));
list.add(new Emp(4,"kate",25,"女",6000));
list.add(new Emp(5,"tom",32,"男",8500));
/*
* 生成一個xml的基本步驟:
* 1:創建文檔對象Document
* 2:爲Document創建根節點
* 3:爲跟節點組建樹狀結構
* 4:創建XMLWriter
* 6:寫出XML
*/
//1:創建文檔對象Document
Document doc = DocumentHelper.createDocument();
//2:爲Document創建根節點
/*
* Document的方法
* Element addElement(String name)
* 該方法用於向文檔中添加給定名字的根元素,返回的Element實例就表示該根元素
* 注意:該方法只能調用一次,調用第二次會拋出異常
*/
Element root = doc.addElement("list");
//循環添加每個員工信息
//for(int i=0;i<list.size();i++){}
for(Emp e : list){
/*
* Element同樣支持方法:
* Element addElement(String name)
* 想當前標籤中添加給定名字的子標籤
*/
//向根標籤中添加emp標籤
Element emp = root.addElement("emp");
//向emp標籤中添加子標籤name
Element name = emp.addElement("name");
name.setText(e.getName());//setText:設置; AddText:現有內容上追加
emp.addElement("age").setText(e.getAge()+"");
emp.addElement("gender").addText(e.getGender());
emp.addElement("salary").addText(e.getSalary()+"");
/*
* 爲標籤添加屬性
* Element addAttribute(String name,String value)
* 爲當前標籤添加名字和對應的值,
* 返回值仍然是當前標籤。
* 這樣可以連續添加若干屬性,就像StringBuilder的append的返回值效果和作用
*/
emp.addAttribute("id", e.getId()+"");
}
/*
* 當退出循環後,那麼Document中的結構就構建完 了。
* 需要將其寫出爲xml
*/
try{
XMLWriter writer = new XMLWriter();
FileOutputStream out = new FileOutputStream("myemp.xml");
writer.setOutputStream(out);
/*
* 將Document對象寫出到文件中,
* 這時會將Document轉換爲xml格式,寫入文件
*/
writer.write(doc);
}catch(Exception e){
}
}
}
package day20150924;
import java.io.File;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* DOM4J對XPath的支持
*/
public class XMLDemo3 {
public static void main(String[] args){
try{
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("myemp.xml"));
// String path = "/list/emp[salary>5000]";
String path2 = "/list/emp/@id";//或者 "//@id"
// String path = "/list/emp[gender='女']";
//String path = "/list/emp[gender='女']/salary";
String path = "/list/emp[gender='女']/salary[.>4000]";
/*
* List selectNodes(String xpath)
* 根據給定的XPATH查詢對應的節點
*/
List list = doc.selectNodes(path);//返回Element集合
List list2 = doc.selectNodes(path2);//返回Attribute集合
for(Object o : list){
Element e = (Element)o;
String value = e.getStringValue();
System.out.println(value);
}
for(Object o : list2){
Attribute a = (Attribute)o;
String value = a.getStringValue();
String name = a.getName();
System.out.println(name+",,,"+value);
}
}catch(Exception e){
}
}
}