在eclipse中建立maven项目,会自动生成各个文件夹和配置文件
需要读取xml文件,要导入包 dom4j,在文件pom.xml中配置下面这项,注意,要写在
dom4j
dom4j
1.6.1
读取xml文件,转换为对象保存在内存中
emplist.xml,是需要读取的xml文件
one
22
男
1500
two
23
男
3000
three
23
男
3500
将上面xml信息,实例化的实体类
package day12;
* 该类用于表示xml文档中的一个员工信息
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文档,将所有的员工信息读取
* 出来并转换为若干Emp实例,存入一个List集合中
*
* 解析XML的流程:
* 1. 创建SAXReader
* 2. 使用SAXReader读取XML文档并返回Document对象
* 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文档中的标签
*
*Element提供了获取元素的相关方法:
*
*String getName() --获取当前标签的名字
*List elements() --获取当前标签下的所有子标签
*List element(String name) --获取当前标签下所有同名子标签
*Element element(String name) --获取指定名字的子标签
*Attribute attribute(String name) --获取指定名字的属性,getName(),getValue()
*
*String getText() --获取当前标签中的文本
*(前标签和后标签中间的文本信息,前提是确实为文本而不是子标签)
Element root = doc.getRootElement();
List emplist = new ArrayList();
// 获取根标签下面的所有子标签
List elements = root.elements();
* 遍历所有标签并解析出该员工相关信息并以一个Emp实例
* 保存然后将其存入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()+"个员工");
for(Emp e:emplist) {
System.out.println(e);
}
System.out.println(emplist);
}catch (Exception e) {
e.printStackTrace();
}
}
}
打印结果:
解析完毕
共有3个员工
1,one,22,男,1500
2,two,23,男,3000
3,three,23,男,3500
[1,one,22,男,1500, 2,two,23,男,3000, 3,three,23,男,3500]
将对象转换为xml文件
要注意把Emp类放在同一个包下
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 emplist = new ArrayList();
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. 创建一个Document对象表示一个空白的xml文档
* 2. 向Document对象中添加根元素
* 3. 按照应当生成的xml文档的格式逐级向根元素中添加子元素以形成xml文档格式
* 4. 创建XmlWriter
* 5. 通过XmlWriter将Document写出
XMLWriter writer = null;
try {
Document document = DocumentHelper.createDocument();
* 添加根标签
* Document提供了根元素的方法
*
* Element addElement(String name)
* 该方法可以向当前文档中添加给定名字的根元素,并将添加进入的
* 元素以一个Element实例返回,以便于对该元素继续操作。
* 需要注意,该方法只能调用一次,因为一个文档中的根元素只能有一个。
Element root = document.addElement("list");
for(Emp emp:emplist) {
* Element addElement(String name)
* 向当前标签中添加给定名字的子标签并将其返回,以便继续操作
*
* Element addText(String text)
* 向当前标签中添加文本信息,返回值为当前文档标签
*
* Element addAttribute(String name,String value)
* 向当前标签中添加属性,返回值为当前标签
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()
* 不加这句输出结果是在一行显示的,加上会格式化写入,也就是有缩进的代码模式
writer.write(document);
System.out.println("写出完毕!");
}catch(Exception e){
e.printStackTrace();
}finally {
if(writer != null) {
try {
writer.close();
System.out.println("关闭文件流");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
打印结果:
写出完毕!
关闭文件流
最终输出的myemp.xml文件
one
男
1200
two
男
2400
three
男
4800
four
男
9600
five
男
19200
java Xpath 的使用
记得在maven中引入包 jaxen,添加如下
jaxen
jaxen
1.1.6
使用Xpath检索XML数据
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数据
public class XpathDemo {
public static void main(String[] args) {
try {
SAXReader reader = new SAXReader();
Document doc = reader.read(new FileInputStream("myemp.xml"));
* Document支持使用xpath检索数据,前提是必须引入jaxen这个jar
String xpath = "/list/emp[gender='男']/name";
List list = doc.selectNodes(xpath);
for(Element ele:list) {
System.out.println(ele.getName()+":"+ele.getText());
}
}catch (Exception e) {
System.out.println(e.getMessage());
}
}
}