DOM解析原理:xml解析器一次性把整個xml文檔加載進內存蚁滋,然后在內存中構建一顆Document的對象樹旺嬉,通過Document對象馆揉,得到樹上的節(jié)點對象既穆,通過節(jié)點對象訪問(操作)到xml文檔的內容讶隐。
在src目錄下建立一個lib包起胰,將dom4j-1.6.1.jar這個jar包放在該目錄下(該jar包可在網(wǎng)上下載),右擊在jar文件選擇Build path—>add to Build path,導入jar包成功巫延。
準備工作效五,在src下建立一個xml目錄,并在目錄下建立一個Emp類
'''
package xml;
public class Emp {
private int id;
private String name;
private int age;
private String gender;
private int salary;
public Emp(int id, String name, int age, String gender, int salary) {
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 "Emp [id=" + id + ",name=" + name + ",age=" + age + ","
+ "gender=" + gender + ",salary=" + salary + "]";
}
}
'''
- 在項目目錄下建立emplist.xml文件炉峰,注意:在項目目錄下建立畏妖,不是src目錄下面。
'''
<?xml version="1.0" encoding="UTF-8"?>
<list>
<emp id="1">
<name>張三</name>
<age>23</age>
<gender>男</gender>
<salary>2000</salary>
</emp>
<emp id="2">
<name>李四</name>
<age>63</age>
<gender>男</gender>
<salary>2500</salary>
</emp>
<emp id="3">
<name>王五</name>
<age>42</age>
<gender>女</gender>
<salary>12000</salary>
</emp>
<emp id="4">
<name>小李</name>
<age>33</age>
<gender>女</gender>
<salary>4000</salary>
</emp>
<emp id="5">
<name>小靜</name>
<age>18</age>
<gender>女</gender>
<salary>3800</salary>
</emp>
</list>
'''
4疼阔、對emplist.xml進行解析
'''
package xml;
import java.io.File;
import java.io.FileInputStream;
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文檔
- @author ssk
/
public class ParseXmlDemo {
public static void main(String[] args) {
/
* 將emplist.xml文檔中所有文檔信息解析出來
* 存入到List集合中
* 每個員工以一個Emp實例保存
*/
List<Emp> list = new ArrayList<Emp>();
/*
* 使用dom解析XML文檔的大致流程
* 1:創(chuàng)建SAXReader
* 2:使用SAXReader讀取xml文檔戒劫,并生成文檔的Document對象半夷,該對象保存了該文檔所有數(shù)據(jù)及結構。
* 這一步也是DOM解析耗時消耗資源的地方
* 3:通過Document對象獲取根元素
* 4:按照XML文檔的結構從跟元素開始逐步獲取子元素以達到遍歷XML文檔數(shù)據(jù)的目的巫橄。
*/
try {
//1
SAXReader reader = new SAXReader();
//2
//Document document = reader.read(new File("emplist.xml"));
Document document = reader.read(new FileInputStream("emplist.xml"));
//3
Element root = document.getRootElement();
/*
* 獲取根元素<List>中所有名為emp的子元素
*/
List<Element> empList = root.elements("emp");
/*
* 遍歷每個<emp>標簽,獲取員工信息
*/
for(Element empEle : empList) {
//獲取員工名字
//1茵典、獲取<name>標簽
Element nameEle = empEle.element("name");
//2湘换、獲取<name>標簽中間的文本
String name = nameEle.getText();
Element ageEle = empEle.element("age");
int age = Integer.parseInt(ageEle.getText());
Element genderEle = empEle.element("gender");
String gender = genderEle.getText();
//String gender = empEle.elementText("gender");
Element salaryEle = empEle.element("salary");
int salary = Integer.parseInt(salaryEle.getText());
//獲取id
//1、獲取id屬性
Attribute attr = empEle.attribute("id");
int id = Integer.parseInt(attr.getValue());
// int id = Integer.parseInt(empEle.attributeValue("id"));
Emp emp = new Emp(id,name,age,gender,salary);
list.add(emp);
}
System.out.println("解析完畢统阿!");
for(Emp p : list) {
System.out.println(p);
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
'''
5彩倚、讀XML的基本方法
Element getRootElement():Document提供了獲取根元素的方法
String getName(): 獲取當前標簽的名字
String getText(): 獲取當前標簽中間的文字
Element element(String name): 獲取當前標簽指定名字的子標簽
List elements(): 獲取當前標簽中的所有子標簽
List elements(String name): 獲取當前標簽下所有指定名字的同名字標簽
Attribute attribute(String name):獲取指定名字的屬性,Attribute的每一個實例用于表示>>>一個標簽中的一個屬性砂吞, 可以通過它獲取該屬性的名字與對應的屬性值署恍。
String attributeValue(String name):可以直接獲取當前標簽中指定名字的屬性所對應的>>>值。
6蜻直、生成一個xml文件
'''
package xml;
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;
/**
- 使用DOM4j生成一個XML文檔
- @author ssk
*/
public class WriteXmlDemo {
public static void main(String[] args) {
List<Emp> list = new ArrayList<Emp>();
list.add(new Emp(1,"張三",23,"男",2000));
list.add(new Emp(2,"李四",43,"女",2400));
list.add(new Emp(3,"王五",10,"男",3000));
list.add(new Emp(4,"小靜",64,"女",4000));
list.add(new Emp(5,"鐵蛋",27,"男",2500));
/*
* 生成XML的大致步驟
* 1:創(chuàng)建一個Document對象盯质,表示一個空白文檔
* 2:向Document中添加根元素
* 3:創(chuàng)建XMLWriter
* 5:使用XMLWriter將Document對象寫出以生成文檔
*/
try {
//1
Document doc = DocumentHelper.createDocument();
//2
Element root = doc.addElement("list");
/*
* 將集合中每個員工信息以一個<emp>標簽添加到根標簽中
*/
for(Emp emp : list) {
//向根標簽中添加名為<emp>的子元素
Element empEle = root.addElement("emp");
//向<emp>標簽中添加<name>子標簽
Element nameEle = empEle.addElement("name");
nameEle.addText(emp.getName());
Element ageEle = empEle.addElement("age");
ageEle.addText(emp.getAge()+"");
Element genderEle = empEle.addElement("gender");
genderEle.addText(emp.getGender());
Element salaryEle = empEle.addElement("salary");
salaryEle.addText(emp.getSalary()+"");
//添加屬性:id
empEle.addAttribute("id", emp.getId()+"");
}
XMLWriter writer = new XMLWriter(
new FileOutputStream("myemp.xml"),OutputFormat.createPrettyPrint()
);
writer.write(doc);
System.out.println("寫出完畢!");
writer.close();
}catch(Exception e) {
e.printStackTrace();
}
}
}
'''
注意:1概而、所有導入的有關xml的包必須為org.dom4j下的包呼巷,如果沒有正確導入對應的包可能會報錯,或出現(xiàn)其他不理想的情況赎瑰。
2王悍、XMLWriter構造方法中加入?yún)?shù)OutputFormat.createPrettyPrint(),生成的帶有格式化的xml文件餐曼,如果不加压储,則生成的xml文件內容在一行。