1.導入dom4j和jaxen
打開pom.xml複製以下代碼保存即可自動安裝
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>tedu.cn</groupId>
<artifactId>JSD1604_XML</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.4</version>
</dependency>
</dependencies>
</project>
2.創建一個emplist.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<list>
<emp id="1">
<name>張三</name>
<age>18</age>
<gender>男</gender>
<salary>3000</salary>
</emp>
<emp id="2">
<name>李四</name>
<age>18</age>
<gender>男</gender>
<salary>3000</salary>
</emp>
<emp id="3">
<name>張發三</name>
<age>18</age>
<gender>男</gender>
<salary>3000</salary>
</emp>
<emp id="4">
<name>法競三</name>
<age>18</age>
<gender>男</gender>
<salary>3000</salary>
</emp>
<emp id="5">
<name>張給</name>
<age>18</age>
<gender>男</gender>
<salary>3000</salary>
</emp>
<emp id="6">
<name>帆帆</name>
<age>18</age>
<gender>女</gender>
<salary>5000</salary>
</emp>
</list>
3.創建一個emp.java的類調用emp.xml
package day12;
/**
* 該類用於表示xml文檔中的一個員工信息
* @author Acer
*
*/
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 "Emp [id=" + id + ", name=" + name + ", age=" + age + ", gender=" + gender + ", salary=" + salary + "]";
}
}
3.使用Dom解析xml文檔,創建一個PraseXmlDemo.java解析emplist.xml
package day12;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
import javax.management.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* 使用Dom解析xml文檔
* @author Acer
*
*/
public class ParseXmlDemo {
public static void main(String[] args) {
/*
* 解析emplist.xml文檔,將所有的員工
* 信息讀取出來並轉換成若干emp實例
* 存入一個list集合中
*
* 解析XML的流程:
* 1.創建SAXReader
* 2.使用SAXReader讀取XML文檔並返回
* Document對象
* 這一步就是DOM解析耗時耗資源的體現
* 因爲DOM會將XML文檔全部讀取並以一個Document
* 對象的形式存於內存。
* Document對象用於描述解析的XML文檔內容。
* 3.根據Document對象回去根元素
* 4.按照xml的結構從根元素中開始逐級獲取子元素
* 以達到便利xml的目的
*
*/
try {
//1
SAXReader reader = new SAXReader();
//2
Document doc = reader.read(
new FileInputStream("emplist.xml"));
/*
* 3.獲取根元素
* Element的每一個實例用於表示xml文檔
* 中的一個元素(一堆標籤)
* 這裏獲取的相當於式emplist.xml文檔中的
* <list>標籤
*/
Element root = doc.getRootElement();
/*
*
* Element提供了獲取元素的相關方法
*
* String getName()
* 獲取當前標籤的名字
*
* List elements()
* 獲取當前標籤下的所有子標籤
*
* List elements(String name)
* 獲取當前標籤下所有同名子標籤
*
* Element element(String name)
* 獲取指定名字的子標籤
*
* Attribute attribute(String name)
* 獲取指定名字的屬性
*
* String getText()
* 獲取當前標籤中的文本(前標籤和後標籤中間的文本信息
* ,前提是確實爲文本而不是子標籤)
*/
List<Emp> emplist = new ArrayList<Emp>();
/*
* 獲取根標籤<list>下面的所有子標籤<emp>
*/
List<Element> elements = root.elements();
/*
* 遍歷所有<emp>標籤並解析出該員工相關信息並一個Emp
* 實例保存然後將其存入emplist集合
*
*/
for(Element empEle : elements) {
//獲取名字
Element nameEle = empEle.element("name");
String name = nameEle.getTextTrim();
//獲取age
int age = Integer.parseInt(
empEle.elementTextTrim("age"));
String gender =
empEle.elementTextTrim("gender");
int salary = Integer.parseInt(
empEle.elementTextTrim("salary"));
/*
* 獲取emp標籤中的id屬性
* Attribute的每一個實例用於表示一個屬性信息
* 常用的方法:
* String getName()獲取當前屬性名
* String getValue()獲取當前屬性值
*/
org.dom4j.Attribute attr = empEle.attribute("id");
int id = Integer.parseInt(
(String) attr.getValue());
Emp emp = new Emp(
id, name, age, gender, salary);
emplist.add(emp);
}
System.out.println("解析完畢!");
System.out.println("共"+emplist.size()+"個員工");
for(Emp emp1 : emplist) {
System.out.println(emp1);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
4.使用DOM生成xml文檔,創建WriterXmlDemo.java文件生成myemp.xml
package day12;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Writer;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.sql.RowSetInternal;
import javax.sql.rowset.WebRowSet;
import javax.sql.rowset.spi.XmlWriter;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
/**
* 使用DOM生成xml文檔
* @author Acer
*
*/
public class WriteXmlDemo {
public static void main(String[] args) {
List<Emp> emplist =
new ArrayList<Emp>();
emplist.add(new Emp(1,"阿飛",23,"男",2300));
emplist.add(new Emp(2,"阿他",22,"女",25300));
emplist.add(new Emp(3,"阿發",82,"男",2300));
emplist.add(new Emp(4,"給飛",22,"女",42300));
emplist.add(new Emp(5,"阿就",252,"男",2300));
emplist.add(new Emp(6,"額外飛",22,"男",8800));
/*
* 將emplist集合中的員工信息保存到
* myemp.xml文檔中
*
* 寫出XML文檔的大致步驟:
* 1.創建一個Document對象表示一個空白的xml文檔
* 2.向Document對象中添加根元素
* 3.按照應當生成的xml文檔的格式逐級向根元素中
* 添加子元素以形成xml文檔格式
* 4.創建xmlwriter
* 5.通過xmlwriter將Document寫出
*/
XMLWriter writer = null;
try {
//1
Document document =
DocumentHelper.createDocument();
/*
* 2添加跟標籤<list>
* Document提供了添加根元素的方法
*
* Element addElement(String name)
* 該方法可以向當前文檔中添加給定名字的根元素,並添加
* 進去的該元素以一個Element實力返回,以便於對的該元素
* 繼續操作
* 需要注意,該方法只能調用一次,應爲一個文檔中只能有
* 一個根元素
*
*/
Element root =
document.addElement("list");
/*
* 將emplist集合中的每個員工信息以一個
* <emp>標籤的形式保存到<list>標籤中
*
*/
for(Emp emp : emplist) {
/*
* Element提供了相關方法:
*
* Element addElement(String name)
* 向當前標籤中添加給定名字的子標籤
* 並將其返回,以便繼續操作
*
* Element addTest(String text)
* 向當前標籤中添加文本信息,返回值爲當前標籤
*
* Element addAttribute(
* String name, String value)
* 向當前標籤中添加屬性,返回值爲當前標籤
*/
//向根標籤<list>中添加子標籤<emp>
Element empEle =
root.addElement("emp");
//向<emp>標籤添加<name>標籤
Element nameEle =
empEle.addElement("name");
nameEle.addText(emp.getName());
//向<emp>標籤添加<age>標籤
empEle.addElement("age").addText(
emp.getAge()+"");
//向<emp>標籤添加<gender>標籤
Element genderEle =
empEle.addElement("gender");
genderEle.addText(emp.getGender());
//向<emp>標籤添加<salary>標籤
Element salaryEle =
empEle.addElement("salary");
salaryEle.addText(emp.getSalary()+"");
//添加屬性:id
empEle.addAttribute("id", emp.getId()+"");
}
FileOutputStream fos =
new FileOutputStream("myemp.xml");
writer = new XMLWriter(fos,OutputFormat.createPrettyPrint());
writer.write(document);
System.out.println("寫出完畢!");
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally {
if(writer != null) {
try {
writer.close();
} catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
}
}
生成 的myemp.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<list>
<emp id="1">
<name>阿飛</name>
<age>23</age>
<gender>男</gender>
<salary>2300</salary>
</emp>
<emp id="2">
<name>阿他</name>
<age>22</age>
<gender>女</gender>
<salary>25300</salary>
</emp>
<emp id="3">
<name>阿發</name>
<age>82</age>
<gender>男</gender>
<salary>2300</salary>
</emp>
<emp id="4">
<name>給飛</name>
<age>22</age>
<gender>女</gender>
<salary>42300</salary>
</emp>
<emp id="5">
<name>阿就</name>
<age>252</age>
<gender>男</gender>
<salary>2300</salary>
</emp>
<emp id="6">
<name>額外飛</name>
<age>22</age>
<gender>男</gender>
<salary>8800</salary>
</emp>
</list>