- 浏览: 21617 次
- 性别:
- 来自: 衡阳
文章分类
最新评论
本文主要讨论了用dom4j解析XML的基础问题,包括建立XML文档,添加、修改、删除节点,以及格式化(美化)输出和中文问题。可作为dom4j的入门资料。
1. 下载与安装
dom4j是sourceforge.net上的一个开源项目,主要用于对XML的解析。从2001年7月发布第一版以来,已陆续推出多个版本,目前最高版本为1.5。
dom4j专门针对Java开发,使用起来非常简单、直观,在Java界,dom4j正迅速普及。
可以到http://sourceforge.net/projects/dom4j下载其最新版。
dom4j1.5的完整版大约13M,是一个名为dom4j-1.5.zip的压缩包,解压后有一个dom4j-1.5.jar文件,这就是应用时需要引入的类包,另外还有一个jaxen-1.1-beta-4.jar文件,一般也需要引入,否则执行时可能抛java.lang.NoClassDefFoundError: org/jaxen/JaxenException异常,其他的包可以选择用之。
2. 示例XML文档(holen.xml)
为了述说方便,先看一个XML文档,之后的操作均以此文档为基础。
- holen.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <books>
- <!--This is a test for dom4j, holen, 2004.9.11-->
- <book show="yes">
- <title>Dom4j Tutorials</title>
- </book>
- <book show="yes">
- <title>Lucene Studing</title>
- </book>
- <book show="no">
- <title>Lucene in Action</title>
- </book>
- <owner>O'Reilly</owner>
- </books>
这是一个很简单的XML文档,场景是一个网上书店,有很多书,每本书有两个属性,一个是书名[title],一个为是否展示[show],最后还有一项是这些书的拥有者[owner]信息。
3. 建立一个XML文档
- /**
- * 建立一个XML文档,文档名由输入属性决定
- * @param filename 需建立的文件名
- * @return 返回操作结果, 0表失败, 1表成功
- */
- public int createXMLFile(String filename){
- /** 返回操作结果, 0表失败, 1表成功 */
- int returnValue = 0;
- /** 建立document对象 */
- Document document = DocumentHelper.createDocument();
- /** 建立XML文档的根books */
- Element booksElement = document.addElement("books");
- /** 加入一行注释 */
- booksElement.addComment("This is a test for dom4j, holen, 2004.9.11");
- /** 加入第一个book节点 */
- Element bookElement = booksElement.addElement("book");
- /** 加入show属性内容 */
- bookElement.addAttribute("show","yes");
- /** 加入title节点 */
- Element titleElement = bookElement.addElement("title");
- /** 为title设置内容 */
- titleElement.setText("Dom4j Tutorials");
-
- /** 类似的完成后两个book */
- bookElement = booksElement.addElement("book");
- bookElement.addAttribute("show","yes");
- titleElement = bookElement.addElement("title");
- titleElement.setText("Lucene Studing");
- bookElement = booksElement.addElement("book");
- bookElement.addAttribute("show","no");
- titleElement = bookElement.addElement("title");
- titleElement.setText("Lucene in Action");
-
- /** 加入owner节点 */
- Element ownerElement = booksElement.addElement("owner");
- ownerElement.setText("O'Reilly");
-
- try{
- /** 将document中的内容写入文件中 */
- XMLWriter writer = new XMLWriter(new FileWriter(new File(filename)));
- writer.write(document);
- writer.close();
- /** 执行成功,需返回1 */
- returnValue = 1;
- }catch(Exception ex){
- ex.printStackTrace();
- }
-
- return returnValue;
- }
说明:
Document document = DocumentHelper.createDocument();
通过这句定义一个XML文档对象。
Element booksElement = document.addElement("books");
通过这句定义一个XML元素,这里添加的是根节点。
Element有几个重要的方法:
l addComment:添加注释
l addAttribute:添加属性
l addElement:添加子元素
最后通过XMLWriter生成物理文件,默认生成的XML文件排版格式比较乱,可以通过OutputFormat类的createCompactFormat()方法或createPrettyPrint()方法格式化输出,默认采用createCompactFormat()方法,显示比较紧凑,这点将在后面详细谈到。
生成后的holen.xml文件内容如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <books><!--This is a test for dom4j, holen, 2004.9.11--><book show="yes"><title>Dom4j Tutorials</title></book><book show="yes"><title>Lucene Studing</title></book><book show="no"><title>Lucene in Action</title></book><owner>O'Reilly</owner></books>
4. 修改XML文档
有三项修改任务,依次为:
l 如果book节点中show属性的内容为yes,则修改成no
l 把owner项内容改为Tshinghua,并添加date节点
l 若title内容为Dom4j Tutorials,则删除该节点
- /**
- * 修改XML文件中内容,并另存为一个新文件
- * 重点掌握dom4j中如何添加节点,修改节点,删除节点
- * @param filename 修改对象文件
- * @param newfilename 修改后另存为该文件
- * @return 返回操作结果, 0表失败, 1表成功
- */
- public int ModiXMLFile(String filename,String newfilename){
- int returnValue = 0;
- try{
- SAXReader saxReader = new SAXReader();
- Document document = saxReader.read(new File(filename));
- /** 修改内容之一: 如果book节点中show属性的内容为yes,则修改成no */
- /** 先用xpath查找对象 */
- 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);
- }
- }
- }
-
- try{
- /** 将document中的内容写入文件中 */
- XMLWriter writer = new XMLWriter(new FileWriter(new File(newfilename)));
- writer.write(document);
- writer.close();
- /** 执行成功,需返回1 */
- returnValue = 1;
- }catch(Exception ex){
- ex.printStackTrace();
- }
-
- }catch(Exception ex){
- ex.printStackTrace();
- }
- return returnValue;
- }
说明:
List list = document.selectNodes("/books/book/@show" );
list = document.selectNodes("/books/book");
上述代码通过xpath查找到相应内容。
通过setValue()、setText()修改节点内容。
通过remove()删除节点或属性。
5. 格式化输出和指定编码
默认的输出方式为紧凑方式,默认编码为UTF-8,但对于我们的应用而言,一般都要用到中文,并且希望显示时按自动缩进的方式的显示,这就需用到OutputFormat类。
- /**
- * 格式化XML文档,并解决中文问题
- * @param filename
- * @return
- */
- public int formatXMLFile(String filename){
- int returnValue = 0;
- try{
- SAXReader saxReader = new SAXReader();
- Document document = saxReader.read(new File(filename));
- XMLWriter writer = null;
- /** 格式化输出,类型IE浏览一样 */
- OutputFormat format = OutputFormat.createPrettyPrint();
- /** 指定XML编码 */
- format.setEncoding("GBK");
- writer= new XMLWriter(new FileWriter(new File(filename)),format);
- writer.write(document);
- writer.close();
- /** 执行成功,需返回1 */
- returnValue = 1;
- }catch(Exception ex){
- ex.printStackTrace();
- }
- return returnValue;
- }
说明:
OutputFormat format = OutputFormat.createPrettyPrint();
这句指定了格式化的方式为缩进式,则非紧凑式。
format.setEncoding("GBK");
指定编码为GBK。
XMLWriter writer = new XMLWriter(new FileWriter(new File(filename)),format);
这与前面两个方法相比,多加了一个OutputFormat对象,用于指定显示和编码方式。
6. 完整的类代码
前面提出的方法都是零散的,下面给出完整类代码。
- Dom4jDemo.java
- package com.holen.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.DocumentHelper;
- import org.dom4j.Element;
- import org.dom4j.io.OutputFormat;
- import org.dom4j.io.SAXReader;
- import org.dom4j.io.XMLWriter;
- //如果是UTF-8 FileWriter 改用 FileOutputStream
- public class Dom4jDemo{
- public Dom4jDemo (){}
- }
相关推荐
8. **转换与格式化**:DOM4J可以将XML Document对象转换为String或OutputStream,同时提供XML格式化的功能,使得输出的XML更易于阅读。 9. **JAXB集成**:DOM4J可以与Java的默认XML绑定框架JAXB进行集成,方便地将...
通常,这涉及到解析XML文件,创建Document对象,然后使用DOM4J提供的方法来设置格式化选项,最后将格式化后的XML输出到文件或控制台。 【标签】"源码"提示我们,这篇内容可能深入到DOM4J的源代码层面,解释了内部的...
本项目就是关于如何使用DOM4j解析XML文件,并利用Apache POI将其转换为标准的XLS(Excel)文件。 首先,DOM4j是Java中一个灵活且功能强大的XML处理库,它提供了完整的API来读取、操作和写入XML文档。通过DOM4j,...
### Dom 4j 格式化 XML 输出详解 #### 概述 Dom 4j 是一个用于处理 XML 文件的强大 Java 库。它提供了一系列简单易用的 API,可以帮助开发者高效地解析、创建和修改 XML 文档。其中,格式化 XML 输出是 Dom 4j ...
### 使用DOM4j解析XML文件:提升开发效率与代码可读性 在现代软件开发中,XML(Extensible Markup Language)是一种广泛使用的数据交换格式,它以人类可读的文本形式存储结构化信息。然而,如何高效、准确地解析XML...
本篇文章将深入探讨如何使用Dom4j,一个流行的Java库,结合XPath来解析XML文件中的路径表达式,同时阐述相对路径和绝对路径的匹配原则。 首先,我们要了解Dom4j库。Dom4j是一个灵活且高效的处理XML的Java库,它提供...
DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了灵活且高效的API,使得XML的解析、创建、修改变得更加简单。在这个场景中,我们关注的是如何使用DOM4J以String的形式读取XML内容,然后将String的值赋给XML...
1. **DOM解析方式**:DOM4J通过DOM接口来解析XML,将整个XML文档加载到内存中形成一个树形结构,称为DOM树。这样做的优点是可以方便地通过路径导航访问任何元素,缺点是如果XML文件过大,可能会消耗大量内存。 2. *...
本文将深入探讨如何使用Dom4j解析XML以及解决中文乱码的问题。 首先,让我们了解Dom4j的基本用法。在解析XML文件时,通常会使用`DocumentBuilderFactory`和`DocumentBuilder`来创建一个`Document`对象,然后通过这...
### DOM4J创建XML文件知识点解析 #### 一、DOM4J简介 DOM4J(Document Object Model for XML)是一款Java平台下的轻量级XML处理框架。它提供了一种非常简便的方式来读取、写入以及操作XML文档。相比于SAX和DOM等...
首先,解析XML文件的核心在于创建Document对象,这可以通过DOM4J的`DocumentHelper`类的`parseText()`或`readFile()`方法实现。例如: ```java import org.dom4j.Document; import org.dom4j.DocumentHelper; ...
4. **读取和写入XML**:DOM4J可以轻松读取XML文件并将其内容加载到内存中,也可以将内存中的XML结构写回文件,支持格式化的XML输出。 5. **命名空间(Namespace)支持**:对于包含命名空间的XML文档,DOM4J提供了很...
这个“XML文件解析的_DOM4J-最新jar”是一个包含DOM4J库的最新版本的Java档案(JAR)文件,用于在Java项目中处理XML。 DOM4J的主要功能包括: 1. **XML解析**:DOM4J支持多种解析方式,如DOM、SAX和StAX。其中,...
1. **解析XML**:DOM4J支持使用DOM、SAX或StAX解析器读取XML文件,其中DOM是将整个XML文档加载到内存中,适用于小型文件;SAX是事件驱动的解析,适用于大文件;而StAX则提供了一种更高效的方式,通过迭代器逐个处理...
本文将深入探讨如何使用Dom4j库在Android环境中创建和解析XML文档。 首先,了解XML(eXtensible Markup Language)的基本概念。XML是一种标记语言,它允许我们在文档中嵌入结构化数据。它的主要优点是数据与显示...
综上所述,DOM4J为处理XML文件提供了强大的工具,无论是读取、遍历、查询还是修改XML内容,都十分方便。在实际项目中,根据具体需求灵活运用DOM4J,能够极大地提高XML操作的效率和便利性。在"DataXml"这个示例中,你...
DOM4J之所以被誉为解析XML的最佳工具,是因为它具有以下显著优点: 1. **易于使用**:DOM4J的API设计简洁明了,开发者可以快速上手。它支持多种解析方式,包括DOM、SAX和StAX,可以根据项目需求选择最适合的方法。 ...
DOM4J作为解析XML的工具,其主要功能和特性包括: 1. **DOM模型**:DOM4J提供了基于DOM(Document Object Model)的接口,允许开发者以树形结构操作XML文档。通过`Document`对象,可以访问XML文档的根元素,并通过`...
1. **解析XML文件**:使用DOM4J的`DocumentHelper`类的`parseText()`或`parse()`方法,可以将XML文件加载为一个`Document`对象。例如: ```java Document document = DocumentHelper.parseText(xmlString); ``` ...
2. **创建Document对象**:解析XML文件时,DOM4J会构建一个Document对象,它是整个XML文档的根节点。使用`DocumentBuilderFactory`和`DocumentBuilder`来实现: ```java DocumentFactory documentFactory = ...