在eclipse中建立maven項(xiàng)目,會(huì)自動(dòng)生成各個(gè)文件夾和配置文件
需要讀取xml文件,要導(dǎo)入包 dom4j,在文件pom.xml中配置下面這項(xiàng),注意,要寫在<project></project>標(biāo)簽中間。
<dependencies>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
</dependencies>
讀取xml文件,轉(zhuǎn)換為對(duì)象保存在內(nèi)存中
emplist.xml,是需要讀取的xml文件
<?xml version="1.0" encoding="UTF-8"?>
<list>
<emp id="1">
<name>one</name>
<age>22</age>
<gender>男</gender>
<salary>1500</salary>
</emp>
<emp id="2">
<name>two</name>
<age>23</age>
<gender>男</gender>
<salary>3000</salary>
</emp>
<emp id="3">
<name>three</name>
<age>23</age>
<gender>男</gender>
<salary>3500</salary>
</emp>
</list>
將上面xml信息,實(shí)例化的實(shí)體類
package day12;
* 該類用于表示xml文檔中的一個(gè)員工信息
public class Emp {
private int id;
private String name;
private int age;
private String gender;
private int salary;
---- 省略get,set方法
public Emp() {}
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 String toString() {
return id+","+name+","+age+","+gender+","+salary;
}
}
處理程序
package day12;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
* 使用DOM解析xml文檔
public class ParseXmlDemo {
public static void main(String[] args) {
* 解析emplist.xml文檔,將所有的員工信息讀取
* 出來并轉(zhuǎn)換為若干Emp實(shí)例,存入一個(gè)List集合中
*
* 解析XML的流程:
* 1. 創(chuàng)建SAXReader
* 2. 使用SAXReader讀取XML文檔并返回Document對(duì)象
* Document對(duì)象
* 這一步就是DOM解析耗時(shí)耗資源的體現(xiàn)
* 因?yàn)镈OM會(huì)將XML文檔全部讀取并以一個(gè)Document對(duì)象形式存于內(nèi)存。
* Document對(duì)象用于描述解析的XML文檔內(nèi)容。
* 3. 根據(jù)Document對(duì)象獲取根元素
* 4. 按照xml的結(jié)構(gòu)從根元素中開始逐級(jí)獲取子元素以達(dá)到遍歷xml的目的
try {
* 1
SAXReader reader = new SAXReader();
* 2
Document doc = reader.read(new FileInputStream("emplist.xml"));
* 3. 獲取根元素
* Element的每一個(gè)實(shí)例用于表示xml文檔中的一個(gè)元素(一個(gè)標(biāo)簽)
* 這里獲取的相當(dāng)于emplist.xml文檔中的<List>標(biāo)簽
*
*Element提供了獲取元素的相關(guān)方法:
*
*String getName() --獲取當(dāng)前標(biāo)簽的名字
*List elements() --獲取當(dāng)前標(biāo)簽下的所有子標(biāo)簽
*List element(String name) --獲取當(dāng)前標(biāo)簽下所有同名子標(biāo)簽
*Element element(String name) --獲取指定名字的子標(biāo)簽
*Attribute attribute(String name) --獲取指定名字的屬性,getName(),getValue()
*
*String getText() --獲取當(dāng)前標(biāo)簽中的文本
*(前標(biāo)簽和后標(biāo)簽中間的文本信息,前提是確實(shí)為文本而不是子標(biāo)簽)
Element root = doc.getRootElement();
List<Emp> emplist = new ArrayList<Emp>();
// 獲取根標(biāo)簽<list>下面的所有子標(biāo)簽<emp>
List<Element> elements = root.elements();
* 遍歷所有<Emp>標(biāo)簽并解析出該員工相關(guān)信息并以一個(gè)Emp實(shí)例
* 保存然后將其存入emplist集合
for(Element empEle: elements) {
int id = Integer.parseInt(empEle.attribute("id").getValue());
String name = empEle.elementText("name");
int age = Integer.parseInt(empEle.elementText("age"));
String gender = empEle.elementText("gender");
int salary = Integer.parseInt(empEle.elementText("salary"));
Emp emp = new Emp(id,name,age,gender,salary);
emplist.add(emp);
}
System.out.println("解析完畢");
System.out.println("共有"+emplist.size()+"個(gè)員工");
for(Emp e:emplist) {
System.out.println(e);
}
System.out.println(emplist);
}catch (Exception e) {
e.printStackTrace();
}
}
}
打印結(jié)果:
解析完畢
共有3個(gè)員工
1,one,22,男,1500
2,two,23,男,3000
3,three,23,男,3500
[1,one,22,男,1500, 2,two,23,男,3000, 3,three,23,男,3500]
將對(duì)象轉(zhuǎn)換為xml文件
要注意把Emp類放在同一個(gè)包下
package day12;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
* 使用DOM生成xml文檔
public class WriteXmlDemo {
public static void main(String[] args) {
List<Emp> emplist = new ArrayList<Emp>();
emplist.add(new Emp(1,"one",22,"男",1200));
emplist.add(new Emp(2,"two",23,"男",2400));
emplist.add(new Emp(3,"three",24,"男",4800));
emplist.add(new Emp(4,"four",25,"男",9600));
emplist.add(new Emp(5,"five",26,"男",19200));
* 將emplist集合中的員工信息保存到myemp.xml文檔中。
* 寫出XML文檔的步驟:
* 1. 創(chuàng)建一個(gè)Document對(duì)象表示一個(gè)空白的xml文檔
* 2. 向Document對(duì)象中添加根元素
* 3. 按照應(yīng)當(dāng)生成的xml文檔的格式逐級(jí)向根元素中添加子元素以形成xml文檔格式
* 4. 創(chuàng)建XmlWriter
* 5. 通過XmlWriter將Document寫出
XMLWriter writer = null;
try {
Document document = DocumentHelper.createDocument();
* 添加根標(biāo)簽<list>
* Document提供了根元素的方法
*
* Element addElement(String name)
* 該方法可以向當(dāng)前文檔中添加給定名字的根元素,并將添加進(jìn)入的
* 元素以一個(gè)Element實(shí)例返回,以便于對(duì)該元素繼續(xù)操作。
* 需要注意,該方法只能調(diào)用一次,因?yàn)橐粋€(gè)文檔中的根元素只能有一個(gè)。
Element root = document.addElement("list");
for(Emp emp:emplist) {
* Element addElement(String name)
* 向當(dāng)前標(biāo)簽中添加給定名字的子標(biāo)簽并將其返回,以便繼續(xù)操作
*
* Element addText(String text)
* 向當(dāng)前標(biāo)簽中添加文本信息,返回值為當(dāng)前文檔標(biāo)簽
*
* Element addAttribute(String name,String value)
* 向當(dāng)前標(biāo)簽中添加屬性,返回值為當(dāng)前標(biāo)簽
Element empEle = root.addElement("emp");
empEle.addAttribute("id", String.valueOf(emp.getId()));
empEle.addElement("name").addText(emp.getName());
empEle.addElement("gender").addText(emp.getGender());
empEle.addElement("salary").addText(String.valueOf(emp.getSalary()));
}
FileOutputStream fos = new FileOutputStream("myemp.xml");
writer = new XMLWriter(fos,OutputFormat.createPrettyPrint());
* OutputFormat.createPrettyPrint()
* 不加這句輸出結(jié)果是在一行顯示的,加上會(huì)格式化寫入,也就是有縮進(jìn)的代碼模式
writer.write(document);
System.out.println("寫出完畢!");
}catch(Exception e){
e.printStackTrace();
}finally {
if(writer != null) {
try {
writer.close();
System.out.println("關(guān)閉文件流");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
打印結(jié)果:
寫出完畢!
關(guān)閉文件流
最終輸出的myemp.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<list>
<emp id="1">
<name>one</name>
<gender>男</gender>
<salary>1200</salary>
</emp>
<emp id="2">
<name>two</name>
<gender>男</gender>
<salary>2400</salary>
</emp>
<emp id="3">
<name>three</name>
<gender>男</gender>
<salary>4800</salary>
</emp>
<emp id="4">
<name>four</name>
<gender>男</gender>
<salary>9600</salary>
</emp>
<emp id="5">
<name>five</name>
<gender>男</gender>
<salary>19200</salary>
</emp>
</list>
java Xpath 的使用
記得在maven中引入包 jaxen,添加如下
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.6</version>
</dependency>
使用Xpath檢索XML數(shù)據(jù)
package day12;
import java.io.FileInputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
* 使用Xpath檢索XML數(shù)據(jù)
public class XpathDemo {
public static void main(String[] args) {
try {
SAXReader reader = new SAXReader();
Document doc = reader.read(new FileInputStream("myemp.xml"));
* Document支持使用xpath檢索數(shù)據(jù),前提是必須引入jaxen這個(gè)jar
String xpath = "/list/emp[gender='男']/name";
List<Element> list = doc.selectNodes(xpath);
for(Element ele:list) {
System.out.println(ele.getName()+":"+ele.getText());
}
}catch (Exception e) {
System.out.println(e.getMessage());
}
}
}