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>