我们知道了常用的dom解析以及sax解析。那么还有别的解析技术吗?答案是肯定的,接下来我将给大家来解释一下另外一个解析技术——dom4j。
什么是dom4j呢?
Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早期开发JDOM开发的。与JDOM不同的是,dom4j使用接口和抽象的人分离出来而后独立基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。
1.读取XML文件,获得document对象
SAXReaderreader = new SAXReader();
Document document= reader.read(newFile("input.xml"));
2.解析XML形式的文本,得到document对象.
String text = "<members></members>";
Document document= DocumentHelper.parseText(text);
3.主动创建document对象.
Document document= DocumentHelper.createDocument();
//创建根节点
Elementroot = document.addElement("members");
下面我主要介绍第一种获取document对象的方式:
xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<四大名著>
<西游记 id="x001">
<作者>吴承恩</作者>
</西游记>
<红楼梦 name="作者">
<朝代>清朝</朝代><![CDATA[asd]]>
</红楼梦>
</四大名著>
dom4j解析测试:
import java.io.File;
import java.io.FileWriter;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
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 Demo01 {
@Test
public void test() throws Exception {
// 创建saxReader对象
SAXReader reader = new SAXReader();
// 通过read方法读取一个文件 转换成Document对象
Document document = reader.read(new File("src/dom4j/sida.xml"));
Element node = document.getRootElement();
//listNodes(node);
//获取四大名著元素节点中,自节点名称为红楼梦元素的节点
Element element=node.element("红楼梦");
//删除指定属性
Attribute attr=element.attribute("id");//获取指定属性
element.remove(attr);
//添加指定属性
element.addAttribute("name", "作者");
//在指定节点下面添加文本的操作
Element newElement=element.addElement("朝代");//获取指定元素节点
newElement.setText("清朝");
//删除指定节点的操作
Element author=element.element("作者");//获取想要删除的元素节点
boolean flag=element.remove(author);//通过该元素节点的父节点调用remove()方法来删除指定节点
System.out.println(flag);//判断返回的布尔值,如果为真则删除成功,如果为假则删除不成功。
//插入一个新的CADA区域
element.addCDATA("asd");//不被编译,原样输出
writer(document);
}
/**
* 遍历当前节点元素下面的所有(元素的)子节点
*
* @param node
*/
public void listNodes(Element node) {
System.out.println("当前节点的名称::" + node.getName());
// 获取当前节点的所有属性节点
List<Attribute> list = node.attributes();
// 遍历属性节点
for (Attribute attr : list) {
System.out.println(node.getName() + "-----" + attr.getName()
+ "---" + attr.getValue());
//在这里getText()和getValue()一样
}
if (!(node.getTextTrim().equals(""))) {//不把空格和换行输出
System.out.println("文本内容::::" + node.getText());
}
// 当前节点下面子节点迭代器
Iterator<Element> it = node.elementIterator();
// 遍历
while (it.hasNext()) {
// 获取某个子节点对象
Element e = it.next();
// 对子节点进行遍历
listNodes(e);
}
}
/**
* 将xml文件写出去
* @param document
* @throws Exception
*/
public void writer(Document document) throws Exception{
OutputFormat format=OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter writer=new XMLWriter(new FileWriter("src/dom4j/xx.xml"),format);
writer.write(document);
writer.flush();
writer.close();
}
}
字符串与XML的转换
import java.io.File;
import java.io.FileWriter;
import org.dom4j.Document;
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 Demo02 {
@Test
public void test() throws Exception{
//test1();
test2();
//test3();
}
//将指定字符串转换为document对象
public void test1() throws Exception{
String text="<csdn><java>Java班</java><net>Net班</net></csdn>";
Document document=DocumentHelper.parseText(text);//通过DocumentHelper的parseText()方法将指定字符串解析为一个document对象
//将文件写出去
writer(document);
}
//定义主动创建document对象的方法
public void test3() throws Exception{
Document document=DocumentHelper.createDocument();//主动生成document对象
//设置根节点
Element root=document.addElement("csdn");
Element java=root.addElement("java");
java.setText("2012级-CSDN-java班");
Element net=root.addElement("net");
net.setText("2012级-CSDN-net班");
//将文件写出去
writer(document);
}
//定义向外写出文件的方法
public void writer(Document document) throws Exception{
OutputFormat format=OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(new FileWriter("src/dom4j/a.xml"),format);
writer.write(document);
writer.close();
}
//将xml文件转换为字符串
public void test2() throws Exception{
SAXReader reader=new SAXReader();//创建sax读取器对象
Document document=reader.read(new File("src/dom4j/a.xml"));//通过读取器读取指定xml文件,并将其转换为document对象
Element root=document.getRootElement();//获取根节点
//将xml文档转换为string字符串
String docXmlText=document.asXML();
System.out.println(docXmlText);
System.out.println("-------------");
String rootXmlText=root.asXML();
System.out.println(rootXmlText);
System.out.println("-------------");
Element java=root.element("java");
String s=java.asXML();
System.out.println(s);
System.out.println("-------------");
}
}