Dom4j解析XML_动力节点Java学院整理

dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它.

对主流的java XML API进行的性能、功能和易用性的评测,dom4j无论在那个方面都是非常出色的。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,例如hibernate,包括sun公司自己的JAXM也用了Dom4j。

使用Dom4j开发,需下载dom4j相应的jar文件

1.官网下载: http://www.dom4j.org/dom4j-1.6.1/

2.dom4j是sourceforge.net上的一个开源项目,因此可以到http://sourceforge.Net/projects/dom4j下载其最新版.

打开dom4j-1.6.1的解压文件,在这里可以看到有docs帮助的文件夹,也有需要使用dom4j解析xml文件的dom4j-1.6.1.jar文件.我们只需要把dom4j-1.6.1.jar文件构建到我们开发的项目中就可以使用dom4j开发了.

下面我以Myeclipse创建Java项目的构建方法为例说明.

首先创建一个demo项目,在demo项目中创建一个lib文件,把dom4j-1.6.1.jar文件拷贝到lib中,然后右键dom4j-1.6.1jar文件

点击Add to Build Path即可构建到项目中去了.

备注:如果进行的是web项目开发,我们只需要把它拷贝到web-inf/lib中去即可,会自动构建到web项目中.

在项目开发的过程中可以参考docs文件夹的(帮助文档),找到index.html打开,点击Quick start可以通过帮助文档进行学习 dom4j进行xml的解析.

下面我对我认为api中重要的方法进行翻译说明如下:

一、DOM4j中,获得Document对象的方式有三种:

//1.读取XML文件,获得document对象
         SAXReader reader = new SAXReader();
    Document  document = reader.read(new File("csdn.xml"));
//2.解析XML形式的文本,得到document对象.
         String text = "<csdn></csdn>";
         Document document = DocumentHelper.parseText(text);
//3.主动创建document对象.
         Document document = DocumentHelper.createDocument();       //创建根节点
         Element root = document.addElement("csdn"); 

二、节点对象操作的方法

//1.获取文档的根节点.
   Element root = document.getRootElement();
//2.取得某个节点的子节点.
   Element element=node.element(“四大名著");
//3.取得节点的文字
    String text=node.getText();
//4.取得某节点下所有名为“csdn”的子节点,并进行遍历.
    List nodes = rootElm.elements("csdn");
     for (Iterator it = nodes.iterator(); it.hasNext();) {
   Element elm = (Element) it.next();
  // do something
 }
//5.对某节点下的所有子节点进行遍历.
   for(Iterator it=root.elementIterator();it.hasNext();){
    Element element = (Element) it.next();
    // do something
 }
// 6.在某节点下添加子节点
 Element elm = newElm.addElement("朝代");
//7.设置节点文字.
 elm.setText("明朝");
//8.删除某节点. //childElement是待删除的节点,parentElement是其父节点
parentElement.remove(childElment);
//9.添加一个CDATA节点.
Element contentElm = infoElm.addElement("content"); contentElm.addCDATA(“cdata区域”); 

三、节点对象的属性方法操作

//1.取得某节点下的某属性   Element root=document.getRootElement();     //属性名name
     Attribute attribute=root.attribute("id");
//2.取得属性的文字
  String text=attribute.getText();
//3.删除某属性 Attribute attribute=root.attribute("size"); root.remove(attribute);
//4.遍历某节点的所有属性
   Element root=document.getRootElement();
    for(Iterator it=root.attributeIterator();it.hasNext();){
      Attribute attribute = (Attribute) it.next();
      String text=attribute.getText();
      System.out.println(text);
 }
// 5.设置某节点的属性和文字.  

 newMemberElm.addAttribute("name", "sitinspring");
//6.设置属性的文字  

 Attribute attribute=root.attribute("name");  attribute.setText("csdn");

四、将文档写入XML文件

//1.文档中全为英文,不设置编码,直接写入的形式.
    XMLWriter writer = new XMLWriter(new FileWriter("ot.xml"));
    writer.write(document);
    writer.close();
// 2.文档中含有中文,设置编码格式写入的形式.
    OutputFormat format = OutputFormat.createPrettyPrint(); // 创建文件输出的时候,自动缩进的格式
    format.setEncoding("UTF-8");//设置编码
    XMLWriter writer = new XMLWriter(newFileWriter("output.xml"),format);
    writer.write(document);
    writer.close();

五、字符串与XML的转换

// 1.将字符串转化为XML
   String text = "<csdn> <java>Java班</java></csdn>";
   Document document = DocumentHelper.parseText(text);
// 2.将文档或节点的XML转化为字符串.
    SAXReader reader = new SAXReader();
    Document  document = reader.read(new File("csdn.xml"));
    Element root=document.getRootElement();
    String docXmlText=document.asXML();
    String rootXmlText=root.asXML();
    Element memberElm=root.element("csdn");
    String memberXmlText=memberElm.asXML(); 

 六、案例(解析sida.xml文件并对其进行curd的操作)

1.sida.xml描述四大名著的操作,文件内容如下

<?xml version="1.0" encoding="UTF-8"?>
<四大名著>
  <西游记 id="x001">
    <作者>吴承恩1</作者>
    <作者>吴承恩2</作者>
    <朝代>明朝</朝代>
  </西游记>
  <红楼梦 id="x002">
    <作者>曹雪芹</作者>
  </红楼梦>
</四大名著> 

2.解析类测试操作

package dom4j; 

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
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("红楼梦");
    //获取element的id属性节点对象
    Attribute attr = element.attribute("id");
    //删除属性
    element.remove(attr);
    //添加新的属性
    element.addAttribute("name", "作者");
    // 在红楼梦元素节点中添加朝代元素的节点
    Element newElement = element.addElement("朝代");
    newElement.setText("清朝");
    //获取element中的作者元素节点对象
    Element author = element.element("作者");
    //删除元素节点
    boolean flag = element.remove(author);
    //返回true代码删除成功,否则失败
    System.out.println(flag);
    //添加CDATA区域
    element.addCDATA("红楼梦,是一部爱情小说.");
    // 写入到一个新的文件中
    writer(document); 

  } 

  /**
   * 把document对象写入新的文件
   *
   * @param document
   * @throws Exception
   */
  public void writer(Document document) throws Exception {
    // 紧凑的格式
    // OutputFormat format = OutputFormat.createCompactFormat();
    // 排版缩进的格式
    OutputFormat format = OutputFormat.createPrettyPrint();
    // 设置编码
    format.setEncoding("UTF-8");
    // 创建XMLWriter对象,指定了写出文件及编码格式
    // XMLWriter writer = new XMLWriter(new FileWriter(new
    // File("src//a.xml")),format);
    XMLWriter writer = new XMLWriter(new OutputStreamWriter(
        new FileOutputStream(new File("src//a.xml")), "UTF-8"), format);
    // 写入
    writer.write(document);
    // 立即写入
    writer.flush();
    // 关闭操作
    writer.close();
  } 

  /**
   * 遍历当前节点元素下面的所有(元素的)子节点
   *
   * @param node
   */
  public void listNodes(Element node) {
    System.out.println("当前节点的名称::" + node.getName());
    // 获取当前节点的所有属性节点
    List<Attribute> list = node.attributes();
    // 遍历属性节点
    for (Attribute attr : list) {
      System.out.println(attr.getText() + "-----" + attr.getName()
          + "---" + attr.getValue());
    } 

    if (!(node.getTextTrim().equals(""))) {
      System.out.println("文本内容::::" + node.getText());
    } 

    // 当前节点下面子节点迭代器
    Iterator<Element> it = node.elementIterator();
    // 遍历
    while (it.hasNext()) {
      // 获取某个子节点对象
      Element e = it.next();
      // 对子节点进行遍历
      listNodes(e);
    }
  } 

  /**
   * 介绍Element中的element方法和elements方法的使用
   *
   * @param node
   */
  public void elementMethod(Element node) {
    // 获取node节点中,子节点的元素名称为西游记的元素节点。
    Element e = node.element("西游记");
    // 获取西游记元素节点中,子节点为作者的元素节点(可以看到只能获取第一个作者元素节点)
    Element author = e.element("作者"); 

    System.out.println(e.getName() + "----" + author.getText()); 

    // 获取西游记这个元素节点 中,所有子节点名称为作者元素的节点 。 

    List<Element> authors = e.elements("作者");
    for (Element aut : authors) {
      System.out.println(aut.getText());
    } 

    // 获取西游记这个元素节点 所有元素的子节点。
    List<Element> elements = e.elements(); 

    for (Element el : elements) {
      System.out.println(el.getText());
    } 

  } 

}

自己适当注释部分代码观察运行效果,反复练习,希望你对dom4j有进一步的了解.

七、字符串与XML互转换案例

package dom4j; 

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter; 

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 { 

    // 创建saxreader对象
    SAXReader reader = new SAXReader();
    // 读取一个文件,把这个文件转换成Document对象
    Document document = reader.read(new File("src//c.xml"));
    // 获取根元素
    Element root = document.getRootElement();
    // 把文档转换字符串
    String docXmlText = document.asXML();
    System.out.println(docXmlText);
    System.out.println("---------------------------");
    // csdn元素标签根转换的内容
    String rootXmlText = root.asXML();
    System.out.println(rootXmlText);
    System.out.println("---------------------------");
    // 获取java元素标签 内的内容
    Element e = root.element("java");
    System.out.println(e.asXML()); 

  } 

  /**
   * 创建一个document对象 往document对象中添加节点元素 转存为xml文件
   *
   * @throws Exception
   */
  public void test2() throws Exception { 

    Document document = DocumentHelper.createDocument();// 创建根节点
    Element root = document.addElement("csdn");
    Element java = root.addElement("java");
    java.setText("java班");
    Element ios = root.addElement("ios");
    ios.setText("ios班"); 

    writer(document);
  } 

  /**
   * 把一个文本字符串转换Document对象
   *
   * @throws Exception
   */
  public void test1() throws Exception {
    String text = "<csdn><java>Java班</java><net>Net班</net></csdn>";
    Document document = DocumentHelper.parseText(text);
    Element e = document.getRootElement();
    System.out.println(e.getName());
    writer(document);
  } 

  /**
   * 把document对象写入新的文件
   *
   * @param document
   * @throws Exception
   */
  public void writer(Document document) throws Exception {
    // 紧凑的格式
    // OutputFormat format = OutputFormat.createCompactFormat();
    // 排版缩进的格式
    OutputFormat format = OutputFormat.createPrettyPrint();
    // 设置编码
    format.setEncoding("UTF-8");
    // 创建XMLWriter对象,指定了写出文件及编码格式
    // XMLWriter writer = new XMLWriter(new FileWriter(new
    // File("src//a.xml")),format);
    XMLWriter writer = new XMLWriter(new OutputStreamWriter(
        new FileOutputStream(new File("src//c.xml")), "UTF-8"), format);
    // 写入
    writer.write(document);
    // 立即写入
    writer.flush();
    // 关闭操作
    writer.close();
  }
}
(0)

相关推荐

  • java dom4j解析xml文件代码实例分享

    解析xml文件有两种方式,一种是利用Dom去解析,这种方式写起代码比较麻烦,对于刚入手的程序员来说比较容易出问题:第二种就是使用Dom4j包去解析在要使用Dom4j包的时候,肯定要先引入包 复制代码 代码如下: import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.Writer;import java.util.Iterator; import org.dom4j.Docum

  • 在java中使用dom4j解析xml(示例代码)

    虽然Java中已经有了Dom和Sax这两种标准解析方式 但其操作起来并不轻松,对于我这么一个初学者来说,其中部分代码是活生生的恶心 为此,伟大的第三方开发组开发出了Jdom和Dom4j等工具 鉴于目前的趋势,我们这里来讲讲Dom4j的基本用法,不涉及递归等复杂操作 Dom4j的用法很多,官网上的示例有那么点儿晦涩,这里就不写了 首先我们需要出创建一个xml文档,然后才能对其解析 xml文档: 复制代码 代码如下: <?xml version="1.0" encoding=&quo

  • 使用jaxp进行dom解析_动力节点Java学院整理

    1.javax.xml.parsers 包中的DocumentBuilderFactory用于创建DOM模式的解析器对象 , DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法 ,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回 2.调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂. 3.调用工厂对象的 newDocumentBuilder

  • java使用xpath和dom4j解析xml

    1 XML文件解析的4种方法 通常解析XML文件有四种经典的方法.基本的解析方式有两种,一种叫SAX,另一种叫DOM.SAX是基于事件流的解析,DOM是基于XML文档树结构的解析.在此基础上,为了减少DOM.SAX的编码量,出现了JDOM,其优点是,20-80原则(帕累托法则),极大减少了代码量.通常情况下JDOM使用时满足要实现的功能简单,如解析.创建等要求.但在底层,JDOM还是使用SAX(最常用).DOM.Xanan文档.另外一种是DOM4J,是一个非常非常优秀的Java XML API,

  • Java中JDom解析XML_动力节点Java学院整理

    一.前言 JDOM是Breet Mclaughlin和Jason Hunter两大Java高手的创作成果,2000年初,JDOM作为一个开放源代码项目正式开始研发.JDOM是一种解析XML的Java工具包. DOM适合于当今流行的各种语言,包括Java,JavaScripte,VB,VBScript,Perl,C,C++等.它了为HTML和XML文档提供了一个可应用于不同平台的编程接口.W3C DOM的最新信息可从http://www.w3.org/TR2001/WD-DOM-Lever-3-C

  • Dom4j解析XML_动力节点Java学院整理

    dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它. 对主流的java XML API进行的性能.功能和易用性的评测,dom4j无论在那个方面都是非常出色的.如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,例如hibernate,包括sun公司自己的JAXM也用了Dom4j. 使用

  • Sax解析xml_动力节点Java学院整理

    JAVA 解析 XML 通常有两种方式,DOM 和 SAX.DOM 虽然是 W3C 的标准,提供了标准的解析方式,但它的解析效率一直不尽如人意,因为使用DOM解析XML时,解析器读入整个文档并构建一个驻留内存的树结构(节点树),然后您的代码才可以使用 DOM 的标准接口来操作这个树结构.但大部分情况下我们只对文档的部分内容感兴趣,根本就不用先解析整个文档,并且从节点树的根节点来索引一些我们需要的数据也是非常耗时的. SAX是一种XML解析的替代方法.相比于文档对象模型DOM,SAX 是读取和操作

  • Java异常继承结构解析_动力节点Java学院整理

    Java异常类层次结构图: 异常的英文单词是exception,字面翻译就是"意外.例外"的意思,也就是非正常情况.事实上,异常本质上是程序上的错误,包括程序逻辑错误和系统错误.比如使用空的引用.数组下标越界.内存溢出错误等,这些都是意外的情况,背离我们程序本身的意图.错误在我们编写程序的过程中会经常发生,包括编译期间和运行期间的错误,在编译期间出现的错误有编译器帮助我们一起修正,然而运行期间的错误便不是编译器力所能及了,并且运行期间的错误往往是难以预料的.假若程序在运行期间出现了错误

  • Java中使用jaxp进行sax解析_动力节点Java学院整理

    SAX解析XML文件采用事件驱动的方式进行,也就是说,SAX是逐行扫描文件,遇到符合条件的设定条件后就会触发特定的事件,回调你写好的事件处理程序.使用SAX的优势在于其解析速度较快,相对于DOM而言占用内存较少.而且SAX在解析文件的过程中得到自己需要的信息后可以随时终止解析,并不一定要等文件全部解析完毕.凡事有利必有弊,其劣势在于SAX采用的是流式处理方式,当遇到某个标签的时候,它并不会记录下以前所遇到的标签,也就是说,在处理某个标签的时候,比如在startElement方法中,所能够得到的信

  • Nginx简介_动力节点Java学院整理

    1.什么是Nginx Nginx来自俄罗斯的Igor Sysoev在为Rambler Media(http://www.rambler.ru/)工作期间,使用C语言开发了Nginx.Nginx作为Web服务器,一直为俄罗斯著名的门户网站Rambler Media提供着出色.稳定的服务. Igor Sysoev将Nginx的代码开源,并且赋予其最自由的2-clause BSD-like license许可证.由于Nginx使用基于事件驱动的架构能够并发处理百万级别的TCP连接,高度模块化的设计和自

  • 十大常见Java String问题_动力节点Java学院整理

    本文介绍Java中关于String最常见的10个问题: 1. 字符串比较,使用 "==" 还是 equals() ? 简单来说, "==" 判断两个引用的是不是同一个内存地址(同一个物理对象). 而 equals 判断两个字符串的值是否相等. 除非你想判断两个string引用是否同一个对象,否则应该总是使用 equals()方法. 如果你了解 字符串的驻留 ( String Interning ) 则会更好地理解这个问题 2. 对于敏感信息,为何使用char[]要比

  • Java JVM原理与调优_动力节点Java学院整理

    JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟机包括一套字节码指令集.一组寄存器.一个栈.一个垃圾回收堆和一个存储方法域. JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行.是运行Java应用最底层部分. JDK(Java Development kit) 整个Java的核心,包括了Java运行环境(Java Runtime E

  • Java中的HashSet详解和使用示例_动力节点Java学院整理

    第1部分 HashSet介绍 HashSet 简介 HashSet 是一个没有重复元素的集合. 它是由HashMap实现的,不保证元素的顺序,而且HashSet允许使用 null 元素. HashSet是非同步的.如果多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它必须 保持外部同步.这通常是通过对自然封装该 set 的对象执行同步操作来完成的.如果不存在这样的对象,则应该使用 Collections.synchronizedSet 方法来"包装" set.

随机推荐