在xml中如果在使用特殊字符想表示字符串的话,要么用转义字符要么用CDATA,它里面表示的都是纯文本
解析xml有两种方式 sax,dom两种方式 这两种是不需要导包的,使用java开发就行,但是代码比较底层编码麻烦,所以再它们的基础上有了二次开发JDOM和DOM4J
使用dom4j解析xml,dom4j属于dom方式解析xml
<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.0</version>
</dependency>
把一个xml解析成实体对象存入集合
package day12;
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文档
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.getText();
int age = Integer.parseInt(
empEle.elementText("age"));
String gender = empEle.elementText("gender");
int salary = Integer.parseInt(
empEle.elementText("salary"));
/*
* 获取emp标签中的id属性
* Attribute的每一个实例用于表示一个
* 属性信息,常用方法:
* String getName()获取当前属性名
* String getValue()获取当前属性值
*/
Attribute attr = empEle.attribute("id");
int id = Integer.parseInt(
attr.getValue());
Emp emp = new Emp(id, name, age, gender, salary);
empList.add(emp);
}
System.out.println("解析完毕!");
System.out.println("共"+empList.size()+"个员工");
for(Emp emp:empList) {
System.out.println(emp);
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<list>
<emp id="1">
<name>张三</name>
<age>34</age>
<gender>男</gender>
<salary>3000</salary>
</emp>
<emp id="2">
<name>李四</name>
<age>21</age>
<gender>女</gender>
<salary>4000</salary>
</emp>
<emp id="3">
<name>王五</name>
<age>46</age>
<gender>女</gender>
<salary>6500</salary>
</emp>
<emp id="4">
<name>赵六</name>
<age>28</age>
<gender>男</gender>
<salary>4400</salary>
</emp>
<emp id="5">
<name>钱七</name>
<age>53</age>
<gender>男</gender>
<salary>12000</salary>
</emp>
</list>
package day12;
/**
* 该类用于表示xml文档中的一个员工信息
* @author Administrator
*
*/
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 + "]";
}
}
使用java代码生成一个xml文件
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文档
* @author Administrator
*
*/
public class WriteXmlDemo {
public static void main(String[] args) {
List<Emp> empList = new ArrayList<Emp>();
empList.add(new Emp(1,"张三",22,"男",3000));
empList.add(new Emp(2,"李四",23,"女",4000));
empList.add(new Emp(3,"王五",24,"男",5000));
empList.add(new Emp(4,"赵六",25,"女",6000));
empList.add(new Emp(5,"钱七",26,"男",7000));
/*
* 将empList集合中的员工信息保存到
* myemp.xml文档中.
*
* 写出XML文档的大致步骤:
* 1:创建一个Document对象表示一个
* 空白的xml文档
* 2:向Document对象中添加根元素
* 3:按照应当生成的xml文档的格式逐级
* 向根元素中添加子元素以形成xml文档格式
* 4:创建XmlWriter
* 5:通过XmlWriter将Document写出
*/
XMLWriter w =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 addText(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());
empEle.addElement("age").addText(String.valueOf(emp.getAge()));
empEle.addElement("gender").addText(emp.getGender());
empEle.addElement("salary").addText(String.valueOf(emp.getSalary()));
empEle.addAttribute("id",String.valueOf(emp.getId()));
}
FileOutputStream fos = new FileOutputStream("myemp.xml");
w = new XMLWriter(fos,OutputFormat.createPrettyPrint());
w.write(document);
System.out.println("写出完毕!");
}catch(Exception e) {
e.printStackTrace();
}finally {
if(w!=null) {
try {
w.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<list>
<emp id="1">
<name>张三</name>
<age>22</age>
<gender>男</gender>
<salary>3000</salary>
</emp>
<emp id="2">
<name>李四</name>
<age>23</age>
<gender>女</gender>
<salary>4000</salary>
</emp>
<emp id="3">
<name>王五</name>
<age>24</age>
<gender>男</gender>
<salary>5000</salary>
</emp>
<emp id="4">
<name>赵六</name>
<age>25</age>
<gender>女</gender>
<salary>6000</salary>
</emp>
<emp id="5">
<name>钱七</name>
<age>26</age>
<gender>男</gender>
<salary>7000</salary>
</emp>
</list>