Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。
下面我们一起来分析一下使用Dom4j对于XML文档的CRUD操作。
Dom4j的主要接口(org.dom4j)
Attribute |
Attribute定义了XML的属性 |
Branch |
Branch为能够包含子节点的节点如XML元素(Element)和文档(Docuemnts)定义了一个公共的行为 |
CDATA |
CDATA 定义了XML CDATA 区域 |
CharacterData |
CharacterData是一个标识借口,标识基于字符的节点。如CDATA,Comment, Text |
Comment |
Comment 定义了XML注释的行为 |
Document |
定义了XML文档 |
DocumentType |
DocumentType 定义XML DOCTYPE声明 |
Element |
Element定义XML 元素 |
ElementHandler |
ElementHandler定义了 Element 对象的处理器 |
ElementPath |
被 ElementHandler 使用,用于取得当前正在处理的路径层次信息 |
Entity |
Entity定义 XML entity |
Node |
Node为所有的dom4j中XML节点定义了多态行为 |
NodeFilter |
NodeFilter 定义了在dom4j节点中产生的一个滤镜或谓词的行为(predicate) |
ProcessingInstruction |
ProcessingInstruction 定义 XML 处理指令 |
Text |
Text 定义XML 文本节点 |
Visitor |
Visitor 用于实现Visitor模式 |
XPath |
XPath 在分析一个字符串后会提供一个XPath 表达式 |
一、 读取并解析XML文档
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.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 Dom4jDeom { @Test public void test1() throws Exception { SAXReader reader = new SAXReader(); //创建阅读器 Document document = reader.read(new File("src\\code1.xml")) //加载XML文档 Element root = document.getRootElement(); //获取根元素 display(root); } private void display(Element root) { // TODO Auto-generated method stub displayAttr(root); //获取属性 for (Iterator<Element> i = root.elementIterator(); i.hasNext();) { Element ele = i.next(); if (ele.isTextOnly()) { displayAttr(ele); System.out.println(ele.getText()); } else { display(ele); //递归调用 } } } @SuppressWarnings("unchecked") private void displayAttr(Element root) { // TODO Auto-generated method stub for (Iterator<Attribute> j = root.attributeIterator(); j.hasNext();) { Attribute attr = j.next(); System.out.println(attr.getName() + " " + attr.getValue()); } } } code1.xml代码如下: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE books[ <!ELEMENT books (book*)> <!ELEMENT book (name,author,price)> <!ELEMENT name (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT price (#PCDATA)> <!ATTLIST author address CDATA #IMPLIED> ]> <books> <book> <name>Java开发</name> <author>佚名1</author> <price>10.00</price> </book> <book> <name>Java讲义</name> <author>佚名2</author> <price>11.00</price> </book> <book> <name>Java Web</name> <author address="保定-河软">佚名3</author> <price>12.00</price> </book> <book> <name>Java 基础</name> <author address="保定-河软">佚名4</author> <price>15.00</price> </book> </books>
二、 使用Dom4j向XML文档中写入内容
1、使用Dom4j直接创建一个新的XML文档
public void test2() throws Exception { Document document = DocumentHelper.createDocument(); Element root = document.addElement("中国"); Element newchild = root.addElement("省份"); Element child = newchild.addElement("陕西省"); child.setText("交通大学"); child = newchild.addElement("河北省"); child.setText("河北软件"); child.addAttribute("dept", "软件系"); child = newchild.addElement("北京市"); child.setText("Microsoft"); OutputFormat format = new OutputFormat(" ", true, "utf-8"); XMLWriter xw = new XMLWriter(new FileWriter("src\\code2.xml"), format); xw.write(document); xw.close(); } 2、使用Dom4j向XML文档的指定位置写入一个元素 public void test4() throws Exception { SAXReader reader = new SAXReader(); Document document = reader.read(new File("src\\code2.xml")); Element root = document.getRootElement(); Element child = DocumentHelper.createElement("天津市"); child.setText("天津纺织工业大学"); //设置元素内容 Element ele = (Element) root.elements("省份").get(1); //获取要写入的元素位置 List list = ele.elements(); list.add(1, child); OutputFormat format = new OutputFormat(" ", true, "utf-8"); XMLWriter xw = new XMLWriter(new FileWriter("src\\code2.xml"), format); xw.write(document); xw.close(); }
三、 删除XML文档中节点处的元素
public void test5() throws Exception { SAXReader reader = new SAXReader(); Document document = reader.read(new File("src\\code2.xml")); Element root = document.getRootElement(); Element ele = (Element) root.elements().get(1); Element et = (Element) ele.elements().get(1); ele.remove(et); OutputFormat format = new OutputFormat(" ", true, "utf-8"); //格式化输出对象 XMLWriter xw = new XMLWriter(new FileWriter("src\\code2.xml"), format); xw.write(document); xw.close(); }
四、修改XML文档中元素的内容
public void test6() throws Exception { SAXReader reader = new SAXReader(); Document document = reader.read(new File("src\\code2.xml")); Element root = document.getRootElement(); Element ele = (Element) root.elements().get(0); Element et = (Element) ele.elements().get(0); et.setText("陕西师范大学"); //修改元素内容 OutputFormat format = new OutputFormat(" ", true, "utf-8"); XMLWriter xw = new XMLWriter(new FileWriter("src\\code2.xml"), format); xw.write(document); xw.close(); //关闭输出流 }
以上便是利用Dom4j的CRUD操作,其中遍历时的迭代方法很重要。另外在对XML文档中的元素进行修改和删除时的元素节点位置的获取也是一个重点。