首页 > 学院 > 开发设计 > 正文

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

2019-11-08 03:03:58
字体:
来源:转载
供稿:网友

基于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();	}}运行结果:


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表