我们知道了常用的dom解析以及sax解析。那么还有别的解析技术吗?答案是肯定的,接下来我将给大家来解释一下另外一个解析技术——dom4j。
什么是dom4j呢?
Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早期开发JDOM开发的。与JDOM不同的是,dom4j使用接口和抽象的人分离出来而后独立基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。
Dom4j
是一个非常优秀的
JavaXML API
,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的
Dom4j
,例如
Hibernate
,包括
sun
公司自己的
JAXM
也用了
Dom4j
。
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("-------------"); } }