java中利用Dom4j解析和生成XML文档_java

一、前言

dom4j是一套非常优秀的Java开源api,主要用于读写xml文档,具有性能优异、功能强大、和非常方便使用的特点。   另外xml经常用于数据交换的载体,像调用webservice传递的参数,以及数据做同步操作等等,   所以使用dom4j解析xml是非常有必要的。

二、准备条件

dom4j.jar

下载地址:http://sourceforge.net/projects/dom4j/

三、使用Dom4j实战

1、解析xml文档

实现思路:

<1>根据读取的xml路径,传递给SAXReader之后 返回一个Document文档对象;

<2>然后操作这个Document对象,获取下面的节点以及子节点的信息;

具体代码如下:

import java.io.File;
import javaioFileInputStream;
import javaioInputStream;
import javautilIterator;
import javautilList; 

import orgdom4jDocument;
import orgdom4jDocumentHelper;
import orgdom4jElement;
import orgdom4jioSAXReader; 

/**
 * 使用dom4j解析xml文档
 * @author Administrator
 *
 */
public class Dom4jParseXmlDemo { 

  public void parseXml01(){
    try{
      //将src下面的xml转换为输入流
      InputStream inputStream = new FileInputStream(new File("D:/project/dynamicWeb/src/resource/modulexml"));
      //InputStream inputStream = thisgetClass()getResourceAsStream("/modulexml");//也可以根据类的编译文件相对路径去找xml
      //创建SAXReader读取器,专门用于读取xml
      SAXReader saxReader = new SAXReader();
      //根据saxReader的read重写方法可知,既可以通过inputStream输入流来读取,也可以通过file对象来读取
      //Document document = saxReaderread(inputStream);
      Document document = saxReaderread(new File("D:/project/dynamicWeb/src/resource/modulexml"));//必须指定文件的绝对路径
      //另外还可以使用DocumentHelper提供的xml转换器也是可以的。
      //Document document = DocumentHelperparseText("<?xml version=\"0\" encoding=\"UTF-8\"?><modules id=\"123\"><module> 这个是module标签的文本信息</module></modules>"); 

      //获取根节点对象
      Element rootElement = documentgetRootElement();
      Systemoutprintln("根节点名称:" + rootElementgetName());//获取节点的名称
      Systemoutprintln("根节点有多少属性:" + rootElementattributeCount());//获取节点属性数目
      Systemoutprintln("根节点id属性的值:" + rootElementattributeValue("id"));//获取节点的属性id的值
      Systemoutprintln("根节点内文本:" + rootElementgetText());//如果元素有子节点则返回空字符串,否则返回节点内的文本
      //rootElementgetText() 之所以会换行是因为 标签与标签之间使用了tab键和换行符布局,这个也算是文本所以显示出来换行的效果。
      Systemoutprintln("根节点内文本(1):" + rootElementgetTextTrim());//去掉的是标签与标签之间的tab键和换行符等等,不是内容前后的空格
      Systemoutprintln("根节点子节点文本内容:" + rootElementgetStringValue()); //返回当前节点递归所有子节点的文本信息。 

      //获取子节点
      Element element = rootElementelement("module");
      if(element != null){
        Systemoutprintln("子节点的文本:" + elementgetText());//因为子节点和根节点都是Element对象所以它们的操作方式都是相同的
      }
      //但是有些情况xml比较复杂,规范不统一,某个节点不存在直接javalangNullPointerException,所以获取到element对象之后要先判断一下是否为空 

      rootElementsetName("root");//支持修改节点名称
      Systemoutprintln("根节点修改之后的名称:" + rootElementgetName());
      rootElementsetText("text"); //同样修改标签内的文本也一样
      Systemoutprintln("根节点修改之后的文本:" + rootElementgetText());
    } catch (Exception e) {
      eprintStackTrace();
    }
  } 

  public static void main(String[] args) {
    Dom4jParseXmlDemo demo = new Dom4jParseXmlDemo();
    demoparseXml01();
  }
}

另外上面的xml在src下面,module01.xml具体如下:

<?xml version="0" encoding="UTF-8"?>
<modules id="123">
  <module> 这个是module标签的文本信息</module>
</modules> 

接下来执行该类的main方法,console效果如下:

由此以知:

<1>dom4j读取xml文件方式有很多样;

<2>取出element对象的文本和标签名称都非常简单;

<3>并且修改元素的文本和标签名称都非常方便,但是不会写入到磁盘xml文件中。

上面只是简单的获取了xml的根目录的元素,接下来使用Iterator 迭代器循环document文档对象。

具体代码如下:

public void parseXml02(){
  try{
    //将src下面的xml转换为输入流
    InputStream inputStream = thisgetClass()getResourceAsStream("/modulexml");
    //创建SAXReader读取器,专门用于读取xml
      SAXReader saxReader = new SAXReader();
      //根据saxReader的read重写方法可知,既可以通过inputStream输入流来读取,也可以通过file对象来读取
      Document document = saxReaderread(inputStream); 

      Element rootElement = documentgetRootElement();
    Iterator<Element> modulesIterator = rootElementelements("module")iterator();
    //rootElementelement("name");获取某一个子元素
    //rootElementelements("name");获取根节点下子元素moudule节点的集合,返回List集合类型
    //rootElementelements("module")iterator();把返回的list集合里面每一个元素迭代子节点,全部返回到一个Iterator集合中
    while(modulesIteratorhasNext()){
      Element moduleElement = modulesIteratornext();
      Element nameElement = moduleElementelement("name");
      Systemoutprintln(nameElementgetName() + ":" + nameElementgetText());
      Element valueElement = moduleElementelement("value");
      Systemoutprintln(valueElementgetName() + ":" + valueElementgetText());
      Element descriptElement = moduleElementelement("descript");
      Systemoutprintln(descriptElementgetName() + ":" + descriptElementgetText());
    }
  } catch (Exception e) {
      eprintStackTrace();
    }
}

另外上面的xml在src下面,module02.xml具体如下:

<?xml version="1.0" encoding="UTF-8"?>
<modules id="123">
  <module>
    <name>oa</name>
    <value>系统基本配置</value>
    <descript>对系统的基本配置根目录</descript>
  </module>
</modules> 

接下来执行该类的main方法,console效果如下:

由此以知:

 <1>dom4j迭代xml子元素非常的效率和便捷;

但是上面只是简单的迭代了xml的子节点元素,但是如果xml规则比较复杂,比如接下来要测试的module03.xml,具体如下:

<?xml version="1.0" encoding="UTF-8"?>
<modules id="123">
   <module>这个是module标签的文本信息</module>
  <module id="">
    <name>oa</name>
    <value>系统基本配置</value>
    <descript>对系统的基本配置根目录</descript>
    <module>这个是子module标签的文本信息</module>
  </module>
   <module>
    <name>管理配置</name>
    <value>none</value>
    <descript>管理配置的说明</descript>
    <module id="106">
      <name>系统管理</name>
      <value>0</value>
      <descript>Config</descript>
      <module id="107">
        <name>部门编号</name>
        <value>20394</value>
        <descript>编号</descript>
      </module>
    </module>
  </module>
</modules>

因为他们的结构不一样,直接迭代的话 会报错:

java.lang.NullPointerException

所以这个时候需要小心使用了,每次都不能把元素直接放进去迭代。具体实现代码如下:

public void parseXml03(){
  try{
    //将src下面的xml转换为输入流
    InputStream inputStream = thisgetClass()getResourceAsStream("/modulexml");
    //创建SAXReader读取器,专门用于读取xml
      SAXReader saxReader = new SAXReader();
      //根据saxReader的read重写方法可知,既可以通过inputStream输入流来读取,也可以通过file对象来读取
      Document document = saxReaderread(inputStream); 

      Element rootElement = documentgetRootElement();
      if(rootElementelements("module") != null ){
      //因为第一个module标签只有内容没有子节点,直接iterator()就javalangNullPointerException了, 所以需要分开实现
      List<Element> elementList = rootElementelements("module");
      for (Element element : elementList) {
        if(!elementgetTextTrim()equals("")){
          Systemoutprintln("【1】" + elementgetTextTrim());
        }else{
          Element nameElement = elementelement("name");
          Systemoutprintln("  【2】" + nameElementgetName() + ":" + nameElementgetText());
          Element valueElement = elementelement("value");
          Systemoutprintln("  【2】" + valueElementgetName() + ":" + valueElementgetText());
          Element descriptElement = elementelement("descript");
          Systemoutprintln("  【2】" + descriptElementgetName() + ":" + descriptElementgetText()); 

          List<Element> subElementList = elementelements("module");
          for (Element subElement : subElementList) {
            if(!subElementgetTextTrim()equals("")){
              Systemoutprintln("   【3】" + subElementgetTextTrim());
            }else{
              Element subnameElement = subElementelement("name");
              Systemoutprintln("   【3】" + subnameElementgetName() + ":" + subnameElementgetText());
              Element subvalueElement = subElementelement("value");
              Systemoutprintln("   【3】" + subvalueElementgetName() + ":" + subvalueElementgetText());
              Element subdescriptElement = subElementelement("descript");
              Systemoutprintln("   【3】" + subdescriptElementgetName() + ":" + subdescriptElementgetText());
            }
          }
        }
      }
      }
  } catch (Exception e) {
      eprintStackTrace();
    }
}

接下来执行该类的main方法,console效果如下:

好了,这下可以解决迭代文档出现空引用的情况了。

另外代码其实可以重构一下,因为循环里面取出子元素的操作都是重复的,可以利用递归改善,但是可读性会变差一点。

如果有些时候需要获取xml中所有的文本信息,又或者别人传递的xml格式不规范,比如标签内名称大小写,虽然xml不区分大小写,但是必须成对出现,所以为了避免这种情况,索性可以将全部的标签名称换为大写,具体代码如下:

public static void main(String[] args) {
  String str = "<?xml version=\"0\" encoding=\"UTF-8\"?><modules id=\"123\"><module> 这个是module标签的文本信息<name>oa</name><value>系统基本配置</value><descript>对系统的基本配置根目录</descript></module></modules>";
  Systemoutprintln(strreplaceAll("<[^<]*>", "_"));
  Pattern pattern = Patterncompile("<[^<]*>");
  Matcher matcher = patternmatcher(str);
  while(matcherfind()){
    str = strreplaceAll(matchergroup(0), matchergroup(0)toUpperCase());
  }
  Systemoutprintln(str); 

} 

运行之后效果图如下:

2、生成xml文档

dom4j能够解析xml,同样肯定能生成xml,而且使用起来更加简单方便。

实现思路:

   <1>DocumentHelper提供了创建Document对象的方法;

   <2>操作这个Document对象,添加节点以及节点下的文本、名称和属性值;

   <3>然后利用XMLWriter写入器把封装的document对象写入到磁盘中;

具体代码如下:

import java.io.FileWriter;
import javaioIOException;
import javaioWriter; 

import orgdom4jDocument;
import orgdom4jDocumentHelper;
import orgdom4jElement;
import orgdom4jioXMLWriter; 

/**
 * 使用dom4j生成xml文档
 * @author Administrator
 *
 */
public class Dom4jBuildXmlDemo {
  public void build01(){
    try {
      //DocumentHelper提供了创建Document对象的方法
      Document document = DocumentHelpercreateDocument();
      //添加节点信息
      Element rootElement = documentaddElement("modules");
      //这里可以继续添加子节点,也可以指定内容
      rootElementsetText("这个是module标签的文本信息");
      Element element = rootElementaddElement("module"); 

      Element nameElement = elementaddElement("name");
      Element valueElement = elementaddElement("value");
      Element descriptionElement = elementaddElement("description");
      nameElementsetText("名称");
      nameElementaddAttribute("language", "java");//为节点添加属性值
      valueElementsetText("值");
      valueElementaddAttribute("language", "c#");
      descriptionElementsetText("描述");
      descriptionElementaddAttribute("language", "sql server");
      Systemoutprintln(documentasXML()); //将document文档对象直接转换成字符串输出
      Writer fileWriter = new FileWriter("c:\\modulexml");
      //dom4j提供了专门写入文件的对象XMLWriter
      XMLWriter xmlWriter = new XMLWriter(fileWriter);
      xmlWriterwrite(document);
      xmlWriterflush();
      xmlWriterclose();
      Systemoutprintln("xml文档添加成功!");
    } catch (IOException e) {
      eprintStackTrace();
    }
  } 

  public static void main(String[] args) {
    Dom4jBuildXmlDemo demo = new Dom4jBuildXmlDemo();
    demobuild01();
  }
}

运行代码效果如下:
然后去c盘下面查看是否创建成功,结果发现在xml文件中的内容与控制台输出的内容一样。

另外上面生成xml并没有指定编码格式,但是还是显示了UTF-8,说明这个是默认的编码格式,如果想重新指定可以在写入到磁盘之前加上document.setXMLEncoding("GBK");就好了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, dom4j解析xml文档
, dom4j生成xml
dom4j解析xml
dom4j解析xml生成bean、dom4j解析xml生成对象、dom4j解析xml、java dom4j解析xml、dom4j生成xml,以便于您获取更多的相关知识。

时间: 2024-09-12 06:00:23

java中利用Dom4j解析和生成XML文档_java的相关文章

Java编程中应用dom4j轻松地处理XML文档

dom4j是Java平台中一个简单易用的XML处理工具,它使用的是Java的Collections架构,提供了对DOM,SAX,JAXP的完整支持. 1.创建新的XML文档 import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; public class Users { public Document createDocument() { Document document = D

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一3.7 生成XML文档

3.7 生成XML文档 现在你已经知道怎样编写读取XML的Java程序了.下面让我们开始介绍它的反向过程,即产生XML输出.当然,你可以直接通过一系列print调用,打印出各元素.属性和文本内容,以此来编写XML文件,但这并不是一个好主意.这样的代码会非常冗长复杂,对于属性值和文本内容中的那些特殊符号(如:"和<),一不注意就会出错. 一种更好的方式是用文档的内容构建一棵DOM树,然后再写出该树的所有内容.下面的小节将讨论其细节.

《Python Cookbook(第3版)中文版》——6.3 解析简单的XML文档

6.3 解析简单的XML文档 6.3.1 问题 我们想从一个简单的XML文档中提取出数据. 6.3.2 解决方案 xml.etree.ElementTree模块可用来从简单的XML文档中提取出数据.为了说明,假设想对Planet Python(http://planet.python.org )上的RSS订阅做解析并生成一个总结报告.下面的脚本可以完成这个任务: from urllib.request import urlopen from xml.etree.ElementTree impor

在项目中利用TX Text Control进行WORD文档的编辑显示处理

在很多文档管理的功能模块里面,我们往往需要对WORD稳定进行展示.编辑等处理,而如果使用微软word控件进行处理,需要安装WORD组件,而且接口使用也不见得简单易用,因此如果有第三方且不用安装Office的能够展示WORD及进行编辑,那是比较不错的选择,TX Text Control就是这样的控件,本文就是基于这个控件的使用,实现在文档管理项目中的应用. 1.TX Text Control的介绍及使用 TX Text Control是一款功能类似于 MS Word 的文字处理控件,包括文档创建.

利用XSL和ASP实现XML文档在线编辑

xml|在线 本文通过一个详细的例子,来阐述了在线编辑XML文档数据的方法.由于Netscape对XML的支持比较弱,因此,要实现跨平台的数据交换,数据的处理必须在服务器端进行.要编辑XML文档,首先要做的事情就是怎样把这些数据提取并显示给访问者,XSL为我们显示XML文件提供了一个很好的解决方案.下面的例子就是利用XSL样式单把XML文档显示出来,供用户进行编辑,然后再把编辑后的数据提交到服务器,在服务器端进行数据的更新.这里采用ASP(Active Server Pages)来完成我们的任务

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

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

dom4j解析和生成XML文件

转化XML import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.io.SAXReader; public class Foo { public Document parse(URL url) throws DocumentException { SAXReader reader = new SAXReader(); Document document = reader.read(url);

Java多种方式动态生成doc文档_java

本来是要在Android端生成doc的(这需求...),最后方法没有好的方法能够在Android上做到完美,最后还是只能搬迁到服务器.不浪费,还是记录下各框架不支持Android的原因以及他们的特点.Java相关的这类框架还是很多的,有几个还不错,可惜要么不支持Android,要么要收费还价格不低.  经过亲自测试,Android不支持Java的awt很多包不能直接在Android上用,FreeMarker挺不错的,能生成复杂漂亮的doc,可惜不支持Android.用POI在Android上能运

ASP.NET技巧:根据xsd生成xml文档

asp.net|xml|技巧|生成xml 现在有很多的xml工具软件都能根据xsd文件书写出xml文档,.net 没有实现此方法,如是我写了几个浏览.校验.和创建xml的方法全部代码如下: using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;us