一、需求
- 1、XML解析常见的四种:
- sax解析
- dom解析
- jdom解析
- dom4j解析
但是最常用的,还是dom4j,所以,下面我们就是使用一个整体的项目文件,来实现一个解析xml文件的小练习
二、功能实现
1、建立maven项目,因为使用整体项目管理工具,方便我们引入dom4j的包,便于测试!
2、 配置pom.xml文件,引入dom4j依赖
3、现在我们就可以开始写我们的xml文件了,这些文件一般都会放在资源文件夹里,由于我们这小练习,是要解析xml文件,所以,我们可以自定义文件里的标签内容,例如:定义书本信息。
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id = "1001">
<name>open</name>
<author>tom</author>
<price>20</price>
</book>
<book id = "1002">
<name>Java</name>
<author>lili</author>
<price>21</price>
</book>
<book id = "1003">
<name>Java</name>
<author>lisa</author>
<price>24</price>
</book>
</books>
4、因为要解析它,所以,我们可以把这个文件里的信息封装成一个Books实体类,便于之后使用对象去操作。
package com.briup.test;
import java.io.Serializable;
/**
* 书本信息pojo类
* @author LuHua
*
*/
public class Books implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private String id;
private String name;
private String author;
private int price;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public String toString() {
return "Books [id=" + id + ", name=" + name + ", author=" + author + ", price=" + price + "]";
}
}
5、最后写一个测试类,使用dom4j里面的对象以及方法去解析xml文件,其中最重要的一个使用过程,就是使用了dom4j中的io包里的SaxReader方式。
package com.briup.test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* 测试类
* @author LuHua
*
*/
public class BooksTest {
public static void main(String[] args) {
try {
// 解析xml文档
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("src/main/resources/com/briup/test/Books.xml");
// 获取根元素
Element element = document.getRootElement();
// 获取标签元素放到一个lisy集合中
List<Element> list = element.elements();
// 创建一个Students类的list集合容器
List<Books> list2 = new ArrayList<Books>();
// 遍历标签元素
for (Element element2 : list) {
// 创建Students对象
Books books = new Books();
// a.将解析后信息封装为对象
books.setId(element2.attributeValue("id"));
List<Element> ele = element2.elements();
for (Element e : ele) {
if ("name".equals(e.getName())) {
books.setName(e.getText());
} else if ("author".equals(e.getName())) {
books.setAuthor(e.getText());
} else if ("price".equals(e.getName())) {
books.setPrice(Integer.parseInt(e.getText()));
}
}
// b.将每个对象添加到容器中
list2.add(books);
}
// c.构建对象输出流,将容器序列化到文件中
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("src/test/resources/Books.txt"));
out.writeObject(list2);
out.flush();
out.close();
System.out.println("已经完成!");
ObjectInputStream ios = new ObjectInputStream(new FileInputStream("src/test/resources/Books.txt"));
Object object = ios.readObject();
System.out.println(object.toString());
ios.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
6、最后我们可以看看实现的效果,因为我这还是用了对象流进行文件的输入输出,把处理好的数据进行另存到另外一个文件中去,然后再从文件中读取出来输出在控制台,虽然过程有些繁琐,但是运用到了多个知识点!