您的位置:首页 > 其它

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

2017-02-17 22:33 489 查看
基于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();
}
}
运行结果:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: