DOM4J简介 

DOM4J简介

DOM4J是dom4j.org出品的一个开源XML解析包,DOM4J最大的特色是使用大量的接口,这也是它被认为比JDOM灵活的主要原因。
它的主要接口都在org.dom4j这个包里定义:

Attribute 定义了XML属性
Branch Branch为能够包含子节点的节点如XML元素(Element)和文档(Docuemnts)定义了一个公共的行为
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 表达式

使用示例:

1.创建XML文档
首先必须先创建一个document对象来表示整个xml文档
/** 建立document对象 /
Document document = DocumentHelper.createDocument();
为document对象增加直接节点(根节点)
/
* 建立XML文档的根books /
Element booksElement = document.addElement("books");
这里说明在xml文档里添加注释的方法,哪个标签调用添加注释的方法,注释就添加在哪个标签内
/
* 加入一行注释 /
booksElement.addComment("This is a test for dom4j, holen, 2004.9.11");
在根节点下再增加一个子节点,不是用文档对象调用方法,而是用根节点来调用方法
/
* 加入第一个book节点 /
Element bookElement = booksElement.addElement("book");
为这个新增加的节点加入一个属性
/
* 加入show属性内容 /
bookElement.addAttribute("show", "yes");
再在book标签下增加一个子节点title
/
* 加入title节点 /
Element titleElement = bookElement.addElement("title");
在title节点内设置文本
/
* 为title设置内容 /
titleElement.setText("Dom4j Tutorials");
写好了一个基本的xml文档,我们将其内容写入一个文件,用filename指定一个文件路径
/
* 将document中的内容写入文件中 */
XMLWriter writer = new XMLWriter(new FileWriter(new File(filename)));
writer.write(document);
writer.close();
这里就基本完成了一个xml文件的创建。

2.读取xml文件

首先要用一个dom4j中专门用于读取xml文件的类来读取文件
SAXReader saxReader = new SAXReader();
把xml文件读取到我们新创建的document对象里去
Document document = saxReader.read(filename);
现在我们可以来读取这个xml文档中的内容,假如我要读取某个a标签的内容,用一个list来获取所有的a标签
List list = document.selectNodes("/a");
再用一个迭代器来获取这个list的所有成员
Iterator iter = list.iterator();
这样我们可以逐一获取所有的a标签,并读取它的内容,现假设我们要迭代读取a标签下的b标签的文本属性
while (iter.hasNext()) {
Element bookElement = (Element) iter.next();
Iterator iterator = bookElement.elementIterator("b");
while (iterator.hasNext()) {
Element titleElement = (Element) iterator.next();
System.out.println(titleElement.getText());
}
}
到这里我们已经可以基本完成一个读取xml文件的功能。

3.修改xml文件

修改xml文件首先要读取xml文件
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File(filename));
/** 修改内容之一: 如果book节点中show属性的内容为yes,则修改成no /
List list = document.selectNodes("/books/book/@show");//属性前要加@
Iterator iter = list.iterator();
while (iter.hasNext()) {
Attribute attribute = (Attribute) iter.next();
if (attribute.getValue().equals("yes")) {
attribute.setValue("no");
}
}
/
*

  • 修改内容之二: 把owner项内容改为Tshinghua
    • 并在owner节点中加入date节点,date节点的内容为2004-09-11,还为date节点添加一个属性type
      /
      list = document.selectNodes("/books/owner");
      iter = list.iterator();
      if (iter.hasNext()) {
      Element ownerElement = (Element) iter.next();
      ownerElement.setText("Tshinghua");
      Element dateElement = ownerElement.addElement("date");
      dateElement.setText("2004-09-11");
      dateElement.addAttribute("type", "Gregorian calendar");
      }
      /
      * 修改内容之三: 若title内容为Dom4j Tutorials,则删除该节点 /
      list = document.selectNodes("/books/book");
      iter = list.iterator();
      while (iter.hasNext()) {
      Element bookElement = (Element) iter.next();
      Iterator iterator = bookElement.elementIterator("title");
      while (iterator.hasNext()) {
      Element titleElement = (Element) iterator.next();
      if (titleElement.getText().equals("Dom4j Tutorials")) {
      bookElement.remove(titleElement);
      }
      }
      }
      修改完毕后,同创建xml文件一样,将xml文档写入文件
      /
      * 将document中的内容写入文件中 */
      XMLWriter writer = new XMLWriter(new FileWriter(new File(
      newfilename)));
      writer.write(document);
      writer.close();
      这里我们就完成了基本的xml文件修改。
      如果要在某标签下删除某个子标签
      bookElement.remove(titleElement);

作者:我是刘先生
地址:https://www.cnblogs.com/cekaigongchengshi/
文章转载请标明出处,如果,您认为阅读这篇博客让您有些收获,不妨点击一下推荐按钮,据说喜欢分享的,后来都成了大神

欢迎扫码关注微信公众号
原文地址:https://www.cnblogs.com/cekaigongchengshi/p/13731325.html