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

【前言】

         我们上篇说到了 使用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</售价> 
  </书> 
</书架>


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


评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值