xml文档解析之dom4j的增删改查 ,乱码问题

2/22/2017来源:ASP.NET技巧人气:554

基于Dom解析和SAX解析这两种解析思想,出现了许多解析API,其中dom4j可以使用dom解析的方式高效的解析xml文档。dom4j解析在使用时需要导入第三方jar包,dom4j的开发包可以在网上找得到。导入开发包时一般只需要导入核心的开发包就可以直接使用,如果是在使用的过程当中提示缺少什么包可以到dom4j的lib目录下导入缺少的开发包即可。使用dom4j实现xml文档的增删改查的基本操作。首先还是准备一个xml文档。

<books>    
   <book>    
      <title>java从入门到放弃</title>    
      <PRice>10元</price>    
      <author age="12岁">张三</author>    
  </book>    
  <book>    
      <title>C语言从入门到放弃</title>    
      <price>12元</price>    
<author>李四</author>    
</book>    
</books>  首先我们要先了解dom4j中的一些方法,通过查阅api可以得到得到,就不在赘述了。利用dom4j实现的的增删改查的操作。

增:在指定的位置处插入一个节点,首先利用DocumentHelper里面的createElement方法创建一个节点,然后在使用setText设置节点的标签体以及属性等,接着找到要插入位置的父节点,利用父节点身上的add方法添加节点。

删:在指定的位置删除某一个节点。首先要找到这个节点,接着找到这个节点的父节点,然后利用父节点的remove方法删除节点。

改:修改某个节点的属性或者标签体,还是找到这个节点利用addAttribute方法修改属性,当节点没有这个属性时就自动加上,有的话就自动更新。当属性的值设置为null是表示删除这个属性。

查:没什么好说的。

要特别注意的是增删改,对xml的增删改只是对内存当中的document对象进行操作,如果希望修改对xml文档起作用,还需要将内存当中的document对象写入xml文档中,但是还要注意xml乱码的问题。

xml乱码的问题:dom4j将文档载入内存时使用的是xml文档申明时中的Encoding属性的编码集进行的编码,如果在此时使用的writer的内部编码集与最初载入时的编码集不同时,就会出现乱码问题,下面使用了几种不同的方式解决xml乱码的问题。

java实现:1.查找第二本书的名字和作者的名字。2。向book下面插入sale-price标签,并将第一本书设置为12元,第二本书设置为19元。3.将第一本书的sale-price删除掉.4将第一本书的作者的年龄改为22岁。

package com.hhuc.Dom4j;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
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 Dom4jDemo2 {
	@Test
	public void find() throws DocumentException{
		SAXReader reader=new SAXReader();//创建解析器
		Document  document=reader.read("book.xml");//利用解析器读入xml文档
		Element dom=document.getRootElement();//获取文档的根节点
		List<Element> list=dom.elements();//返回包含在dom根节点里面的元素book
		String bookname=list.get(1).elementText("title");
		//String bookname1=list.get(1).element("title").getText();
		//System.out.println(bookname1);
		String attribute=list.get(0).elementText("author");
		System.out.println(attribute);
	}
	@Test
	public void add() throws DocumentException, IOException{
		SAXReader reader=new SAXReader();//创建解析器
		Document document=reader.read("book.xml");//利用解析器读入xml文档
		 Element dom=document.getRootElement();//获取文档的根节点
		 
		Element  addele=DocumentHelper.createElement("sale-price");
		Element addele1=DocumentHelper.createElement("sale-price");
		addele.setText("12元");addele1.setText("19元");
		
		list.get(0).add(addele);
		list.get(1).add(addele1);
	
		OutputStreamWriter out=new OutputStreamWriter(new FileOutputStream("book.xml"),"utf-8");
		dom.write(out);
		out.flush();out.close();
		
	}
	@Test
	public void delete() throws DocumentException, IOException{
		SAXReader sr = new SAXReader();//创建解析器
		Document domcument = sr.read("book.xml");//利益能够解析器读入xml文档
		Element dom =domcument.getRootElement();//获取xml文档根节点
		Element ele=dom.element("book").element("sale-price");
		ele.getParent().remove(ele);
		OutputFormat format=OutputFormat.createPrettyPrint();//格式化输出
		format.setEncoding("gb2312");
		XMLWriter writer=new XMLWriter(new FileOutputStream("book.xml"),format);
		writer.write(domcument);
		writer.flush();
		writer.close();
	}
	@Test
	public void transform() throws DocumentException, IOException{
		SAXReader sr=new SAXReader();//创建解析器
		Document document=sr.read("book.xml");//读入xml文档
		Element root=document.getRootElement();//获取根节点
		Element author=root.element("book").element("author");
		author.addAttribute("age", "22");
		OutputFormat format=OutputFormat.createPrettyPrint();
		XMLWriter writer=new XMLWriter(new OutputStreamWriter(new FileOutputStream("book.xml"),"utf-8"),format);
		writer.write(document);
		writer.flush();writer.close();
	}
}
运行结果: