欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【XML解析】使用Dom4j对XML进行SAX解析

程序员文章站 2022-07-14 16:59:37
...

【前言】

         我们上篇说到了 使用Jaxp对XML进行DOM解析,本篇简介SAX和使用Dom4j对XML进行SAX解析。

【DOM解析 VS SAX解析】

         上篇博客中,我们提到了XML解析的方式有两种,一种是DOM方式,另一种是SAX方式。
         在使用DOM解析XML文档时,需要读取整个XML文档,在内存中构架代表整个DOM树的Document对象,从而再对XML文档进行操作。在这种情况下,如果XML文档特别大,就会消耗计算机的大量内存,而且容易导致内存溢出。
         SAX解析允许在读取文档的时候,就对文档进行处理,而不必等到整个文档装在完才对文档进行操作。所以,SAX占用内存少,解析速度快。
            
          【XML解析】使用Dom4j对XML进行SAX解析
            

【Dom4j简介及CRUD例子】

            
【XML解析】使用Dom4j对XML进行SAX解析

         在使用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</售价> 
  </书> 
</书架>


            dom4j CRUD方法 ↓

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文档的解析,这次的学习比之前都要沉得住心了,感觉收获了不少,多总结多总结多总结,继续加油~