【前言】
我们上篇说到了 使用Jaxp对XML进行DOM解析,本篇简介SAX和使用Dom4j对XML进行SAX解析。【DOM解析 VS SAX解析】
上篇博客中,我们提到了XML解析的方式有两种,一种是DOM方式,另一种是SAX方式。在使用DOM解析XML文档时,需要读取整个XML文档,在内存中构架代表整个DOM树的Document对象,从而再对XML文档进行操作。在这种情况下,如果XML文档特别大,就会消耗计算机的大量内存,而且容易导致内存溢出。
SAX解析允许在读取文档的时候,就对文档进行处理,而不必等到整个文档装在完才对文档进行操作。所以,SAX占用内存少,解析速度快。
【Dom4j简介及CRUD例子】
在使用dom4j之前,我们需要需要导入dom4j以及相应的jar包(下载地址),导入后需要build path把jar包变成奶瓶才OK。
dom4j 的文档(guide.html)写的真的很仔细,很多方法和使用不用死记硬背,遇到去查文档就OK了。
下面分享一下使用 dom4j 对 book.xml 增删改查的功能代码,如有问题,欢迎指正。
book.xml ↓
<?xml version="1.0" encoding="UTF-8"?>
<书架>
<书>
<书名>Java深入了解</书名>
<作者>ddd</作者>
<售价>100</售价>
</书>
<书>
<书名>Java开发</书名>
<作者>luluil</作者>
<售价>120</售价>
</书>
</书架>
package cn.itcast.dom4j;
import java.io.File;
import java.io.FileOutputStream;
import java.util.List;
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;
public class Demo1 {
//读取XML文档第二本书 <书名>Java开发</书名>
public void read() throws Exception{
SAXReader reader = new SAXReader();//得到SAX解析器
Document document = reader.read(new File("src/book.xml"));
Element root=document.getRootElement();
Element book=(Element)root.elements("书").get(1);//list 类型,需要强转
String value=book.element("书名").getText();
System.out.println(value);
}
//读取XML文档第二本书属性 <书名 name="xxx">Java开发</书名>
public void readAttr() throws Exception{
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/book.xml"));
Element root=document.getRootElement();
Element book=(Element)root.elements("书").get(1);//list 类型,需要强转
String value=book.element("书名").attributeValue("name");
System.out.println(value);
}
//在第一本书上加一个新的售价 <售价>200</售价> 乱码原因 sun 的 io
public void add() throws Exception{
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/book.xml"));
Element book=document.getRootElement().element("书");
book.addElement("售价").setText("209元");
OutputFormat format=OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"),format);
writer.write(document);//gb2312
writer.close();
}
//在第一本书指定上加一个新的售价 <售价>200</售价>
public void add2() throws Exception{
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/book.xml"));
Element book=document.getRootElement().element("书");
List list= book.elements();
Element price=DocumentHelper.createElement("售价");
price.setText("309");
list.add(2,price);
OutputFormat format=OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter writer=new XMLWriter(new FileOutputStream("src/book.xml"),format);
writer.write(document);
writer.close();
}
//删除
public void delete() throws Exception {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/book.xml"));
Element price =document.getRootElement().element("书").element("售价");
price.getParent().remove(price);
OutputFormat format=OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter writer=new XMLWriter(new FileOutputStream("src/book.xml"),format);
writer.write(document);
writer.close();
}
//更新
@Test
public void update() throws Exception{
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/book.xml"));
Element book=(Element) document.getRootElement().elements("书").get(1);
book.element("作者").setText("luluil");
OutputFormat format=OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter writer=new XMLWriter(new FileOutputStream("src/book.xml"),format);
writer.write(document);
writer.close();
}
}
【小结】
对于XML文档的解析,这次的学习比之前都要沉得住心了,感觉收获了不少,多总结多总结多总结,继续加油~