1.DOM解析
原理:用IO流将xml文件一次性全部读取,加载进内存并以树状结构来存储
优点:适合解析一些小数据量的xml文件
缺点:不适用于大数据量的xml文件的解析,容易发生内存溢出
2.JODM解析
JDOM相比于DOM简化了API,使用起来能简单些
3.SAX解析
原理:不会将整个xml文档一次性全部加载进内存,而是从上到下读取文档,(基于事件驱动的机制)每解析到一个节点就存入集合中。
优点:解决了DOM解析xml文档时占用大量内存的问题,节省了系统资源,适合解析大数据量的xml文档
缺点:读取xml文件时,无法对文件进行修改
4.DOM4J解析
DOM4J的性能最好,非常适合解析大数据量的xml文件,hibernate就是用的DOM4J来读取XML配置文件
有如下xml文件:<?xml version="1.0" encoding="UTF-8"?>
<users>
<user id="1">
<userName>John</userName>
<password>123456</password>
</user>
<user id="2">
<userName>Daiv</userName>
<password>654321</password>
</user>
</users>
解析代码如下:
package com.qjl.mycms.framework.xmlutil.dom4j;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;
import com.qjl.mycms.sysmanage.bean.User;
/**
* 类描述: 通过DOM4J来解析xml文档以及生成xml文档
* 类名称: com.qjl.mycms.framework.xmlutil.dom4j.Dom4jXml
* 创建人: qjl
* 创建时间: 2017年5月24日 下午9:37:16
* @version V1.0
*/
public class Dom4jXml {
static List<User> userList = new ArrayList<User>();
/**
* 将xml文件解析成数据集合
* @Title: xmlToEntity
*/
public static void xmlToEntity(){
//读取XML文档需要的对象
SAXReader reader = new SAXReader();
try {
//通过saxreader读取已存在的文档内容
Document doc = reader.read("src/user.xml");
//获取文档的根元素
Element root = doc.getRootElement();
//获取根元素下面的所有子元素
@SuppressWarnings("unchecked")
List<Element> elementList = root.elements();
User user = null;
for(Element element:elementList){
user = new User();
//获取属性
Attribute id = element.attribute("id");
//获取值
String value = id.getValue();
//设置实体类的属性值
user.setUserid(new Integer(value));
//获取子元素name
Element name = element.element("userName");
user.setUsername(name.getText());
Element password = element.element("password");
user.setUserpassword(password.getText());
userList.add(user);
}
} catch (DocumentException e) {
e.printStackTrace();
}
for(User user:userList){
System.out.println(user.getUsername()+"---"+user.getUserpassword());
}
}
/**
* 将数据集合生成xml文件
* @Title: entityToXml
*/
public static void entityToXml(){
//创建文档对象
Document doc = DocumentHelper.createDocument();
//创建出根元素对象
Element root = DocumentHelper.createElement("users");
//把根元素对象和文档对象关联在一起
doc.setRootElement(root);
for(User user:userList){
//为根元素下面添加子元素
Element element = root.addElement("user");
//给子元素添加属性
element.addAttribute("id", user.getUserid().toString());
//为user接着添加子元素
Element name = element.addElement("userName");
name.setText(user.getUsername());
Element password = element.addElement("password");
password.setText(user.getUserpassword());
}
//建立字节输出流
OutputStream os = null;
//构造XML格式化对象
OutputFormat opf = new OutputFormat(" ",true,"utf-8");
//XML输出对象
XMLWriter writer = null;
try {
os = new FileOutputStream("src/dom4jUser.xml");
//创建XML输出流
writer = new XMLWriter(os,opf);
writer.write(doc);
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
writer.close();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Test
public void test(){
xmlToEntity();
entityToXml();
}
}