首页 技术 正文
技术 2022年11月12日
0 收藏 770 点赞 4,113 浏览 18251 个字

一、dom4j介绍

dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,dom4j无论在那个方面都是非常出色的。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这是必须使用的jar包,
Hibernate用它来读写配置文件。

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 表达式

看名字大致就知道它们的涵义如何了。要想弄懂这套接口,关键的是要明白接口的继承关系:

  • interface java.lang.Cloneable
  • interface org.dom4j.Node
  • interface org.dom4j.Attribute
  • interface org.dom4j.Branch
  • interface org.dom4j.Document
  • interface org.dom4j.Element
  • interface org.dom4j.CharacterData
  • interface org.dom4j.CDATA
  • interface org.dom4j.Comment
  • interface org.dom4j.Text
  • interface org.dom4j.DocumentType
  • interface org.dom4j.Entity
  • interface org.dom4j.ProcessingInstruction

二、使用dom4j创建xml文档

Document document = DocumentHelper.createDocument();   //通过这句定义一个XML文档对象。
Element root = document.addElement(“根节点名称”);   //通过这句定义一个XML元素,这里添加的是根节点。
Element有几个重要的方法:

  • addComment : 添加注释
  • addAttribute : 添加属性
  • addElement : 添加子元素

最后通过XMLWriter生成物理文件,默认生成的XML文件排版格式比较乱,可以通过OutputFormat类格式化输出,默认采用createCompactFormat()显示比较紧凑,最好使用createPrettyPrint()。

实例代码

public static void main(String[] args) {// 创建文档。
Document document = DocumentHelper.createDocument();// 设置文档DocType,这里为了举例,添加hibernate的DocType
document.addDocType("hibernate-configuration",
"-//Hibernate/Hibernate Configuration DTD 3.0//EN", "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd");// 文档增加节点,即根节点,一个文档只能有一个根节点,多加出错
Element root = document.addElement("skills");// 添加注释
root.addComment("第一个技能");// 根节点下添加节点
Element first = root.addElement("skill");// 节点添加属性
first.addAttribute("name", "独孤九剑");// 节点下添加节点
Element info = first.addElement("info");// 节点设置内容数据
info.setText("为独孤求败所创,变化万千,凌厉无比。其传人主要有风清扬、令狐冲。");
// 创建节点
Element third = DocumentHelper.createElement_x("skill");// 将节点加入到根节点中
root.add(third);// 创建属性,第一个参数指定了拥有者,也可以为null,指定拥有者
Attribute name = DocumentHelper.createAttribute(third, "name", "北冥神功");// 将属性加入到节点上
third.add(name);// 创建子节点并加入到节点中
Element info3 = DocumentHelper.createElement_x("info");
info3.setText("逍遥派的顶级内功之一,能吸人内力转化为自己所有,威力无穷。");
third.add(info3);
try {
// 创建格式化类
OutputFormat format = OutputFormat.createPrettyPrint();// 设置编码格式,默认UTF-8
format.setEncoding("UTF-8");// 创建输出流,此处要使用Writer,需要指定输入编码格式,使用OutputStream则不用
FileOutputStream fos = new FileOutputStream("d:/skills.xml");// 创建xml输出流
XMLWriter writer = new XMLWriter(fos, format);// 生成xml文件
writer.write(document);
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}

生成XML文件内容

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><skills>
<!--第一个技能-->
<skill name="独孤九剑">
<info>为独孤求败所创,变化万千,凌厉无比。其传人主要有风清扬、令狐冲。</info>
</skill>
<skill name="葵花宝典">
<info>宦官所创,博大精深,而且凶险至极。练宝典功夫时,首先要自宫净身。</info>
</skill>
<skill name="北冥神功">
<info>逍遥派的顶级内功之一,能吸人内力转化为自己所有,威力无穷。</info>
</skill>
</skills>

三、使用dom4j解析xml文件

1. 构建dom4j树

org.dom4j.io提供了两个类:SAXReader和DOMReader,DOMReader只能一个现有的w3c DOM树构建dom4j树,即只能从一个org.w3c.dom.Document中构建org.dom4j.Document树,而SAXReader则使用SAX解析器,从不同的输入源构建dom4j树,如可以从xml文件中读取并构建dom4j树。

实例代码:使用SAXReader解析

SAXReader reader = new SAXReader();Document document = reader.read(new File(“d:/skills.xml”));

实例代码:使用DOMReader解析

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
File file = new File("d:/skills.xml");
org.w3c.dom.Document domDocument = db.parse(file);
DOMReader reader = new DOMReader();
org.dom4j.Document document = reader.read(domDocument);
2. 获取节点
获得dom4j树之后,可以根据dom4j树获取节点。首先获取根节点,然后根据根节点获取其子节点。
实例代码:访问根节点
Element root = document.getRootElement();

2. 获取节点

获得dom4j树之后,可以根据dom4j树获取节点。首先获取根节点,然后根据根节点获取其子节点。
实例代码:访问根节点Element root = document.getRootElement();

实例代码:访问所有子节点List skills = root.elements();for (Iterator<?> it = skills.iterator(); it.hasNext();) {Element e = (Element) it.next();//TODO}

实例代码:访问指定名称的节点,如访问名称为“skill”的全部节点List skills = root.elements(“skill”);for (Iterator<?> it = skills.iterator(); it.hasNext();) {Element e = (Element) it.next();//TODO}

实例代码:访问指定名称的第一个节点Element skill = root.element(“skill”); 实例代码:迭代某个元素的所有子元素,如迭代rootfor(Iterator<Element> it = root.elementIterator();it.hasNext();){Element e = it.next();//TODO}

3. 获取属性

获取节点后,可以根据节点获取属性,获得方式与获取节点类似。
实例代码:获取指定名称的元素Element skill = root.element(“skill”);Attribute attr1 = skill.attribute(“name”); 实例代码:按照属性顺序获取属性Element skill = root.element(“skill”);Attribute attr2 = skill.attribute(0); 实例代码:获取某节点下全部属性1Element skill = root.element(“skill”);List<Attribute> list = skill.attributes();for (Iterator<Attribute> it = list.iterator(); it.hasNext();) {Attribute attr = it.next();// TODO} 实例代码:获取某节点下全部属性2Element skill = root.element(“skill”);for (Iterator<Attribute> it = skill.attributeIterator(); it.hasNext();) {Attribute attr = it.next();// TODO}

4. 使用XPath获取节点和属性

Dom4j 中集成了对XPath的支持。在选择节点时,可以直接使用XPath 表达式。这种方式更加方便,简洁,官方文档中推荐使用该种方式。
实例代码:要选择所有的<skill>元素的name属性List list = document.selectNodes(“//skills/skill/@name”);for (Iterator it = list.iterator(); it.hasNext();) {Attribute attr = (Attribute) it.next();//TODO}
注意:为了能够编译执行上述使用XPath表达式的代码,需要配置dom4j 安装包中自带的jaxen包,你也可以从http://sourceforge.net/products/jaxen/上下载jaxen。jaxen是 一个用java开发的XPath引擎,用于配合各种基于XML的对象模型,如DOM,dom4j和JDOM。在dom4-1.6.1 目录下,有一个lib 子目录,其中有个jaxen-1.1-beta-6.jar文件,需要在classpath环境变量中配置该文件的全路径名。

四、使用dom4j修改xml文件

修改xml文件,需要先获取dom4j树(即Document),通常欲修改节点需要先获得该节点或其父节点,欲修改属性,需要先获得该属性所在的节点和该属性。增加操作:参照前文。
删除操作:实例代码:删除某节点Element root = document.getRootElement();Element skill = root.element(“skill”);root.remove(skill); 实例代码:删除指定名称的属性Element skill = root.element(“skill”);skill.remove(skill.attribute(“name”));
修改操作:实例代码:修改节点名称和节点值Element skill = root.element(“skill”);skill.setName(“new_skill”);skill.setText(“你好”); 实例代码:修改属性值Attribute attr = skill.attribute(“name”);attr.setText(“newName”);属性名称无法修改,欲修改属性名称,可以先删除旧属性,再增加新属性

五、常用方法

1.Element元素API

Method CommentgetQName() 元素的QName对象getNamespace() 元素所属的Namespace对象getNamespacePrefix() 元素所属的Namespace对象的prefixgetNamespaceURI() 元素所属的Namespace对象的URIgetName() 元素的local namegetQualifiedName() 元素的qualified namegetText() 元素所含有的text内容,如果内容为空则返回一个空字符串而不是nullgetTextTrim() 元素所含有的text内容,其中连续的空格被转化为单个空格,该方法不会返回nullattributeIterator() 元素属性的iterator,其中每个元素都是Attribute对象attributeValue() 元素的某个指定属性所含的值elementIterator() 元素的子元素的iterator,其中每个元素都是Element对象element() 元素的某个指定(qualified name或者local name)的子元素elementText() 元素的某个指定(qualified name或者local name)的子元素中的text信息getParent 元素的父元素getPath() 元素的XPath表达式,其中父元素的qualified name和子元素的qualified name之间使用”/”分隔isTextOnly() 是否该元素只含有text或是空元素isRootElement() 是否该元素是XML树的根节点

2. Attribute属性API

Method CommentgetQName() 属性的QName对象getNamespace() 属性所属的Namespace对象getNamespacePrefix() 属性所属的Namespace对象的prefixgetNamespaceURI() 属性所属的Namespace对象的URIgetName() 属性的local namegetQualifiedName() 属性的qualified namegetValue() 属性的值

2. 字符串转化

实例代码:把节点,属性,文档等转化成字符串,使用asXML()方法。String docXmlText = document.asXML();String rootXmlText = root.asXML(); 实例代码:把字符串转换为文档,注意引号需要转义String skillString = “<skill name=”xxx”>神龙摆尾</skill>”;Document d = DocumentHelper.parseText(skillString);

3. 命名空间(Namespace)操作

dom4j的名称空间信息api常用的方法有8个。dom4j在Element和Attribute 接口中定义了获取名称空间信息的方法,这些方法和JDOM中的方法相同。如下所示:public java.lang.String getNamespacePrefix()该方法返回元素(属性)的名称空间前缀public java.lang.String getNamespaceURI()该方法返回元素(属性)的名称空间URIpublic java.lang.String getName()该方法返回元素(属性)的本地名public java.lang.String getQualifiedName()该方法返回元素(属性)的限定名public Namespace getNamespace()该方法返回元素本身的名称空间public java.util.List additionalNamespaces()返回某元素上附加的名称空间声明列表,列表中的每一个对象都是Namespace类型。这个类的方法提供了两个方法分别获得名称空间前缀和本地名。如下:public java.lang.String getPrefix()该方法返回名称空间前缀。public java.lang.String getURI()该方法返回名称空间的URI。

六、Qname介绍

Qname在使用dom4j的时候,经常见到,一般自己解析的xml很少使用这种复杂格式。1. 来历:qname是qualified name的简写2. 构成:由名字空间(namespace)前缀(prefix)以及冒号(:),还有一个元素名称构成3. 举例:<xsl:stylesheet xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”xmlns=”http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”version=”1.0″><xsl:template match=”foo”><hr/></xsl:template></xsl:stylesheet>xsl是名字空间前缀,template是元素名称,xsl:template 就是一个qname。4.总结:qname无非是有着特定格式的xml元素,其作用主要是增加了名字空间,比如有同样的元素名称,而名字空间不同的情况。

七、Visitor模式

dom4j对visitor的支持可以大大缩减代码量,并且清楚易懂。这个模式很有用、很实用!自己的类需要继承VisitorSupport,由于VisitorSupport使用适配器模式,可以覆写需要的方法,不需要的方法VisitorSupport提供了空实现。
实例代码:MyVisitor,这里将所有可以覆写的visit方法都显示了,可以根据需要覆写package piaohan.util.xml; import org.dom4j.Attribute;import org.dom4j.CDATA;import org.dom4j.Comment;import org.dom4j.Document;import org.dom4j.DocumentType;import org.dom4j.Element;import org.dom4j.Entity;import org.dom4j.Namespace;import org.dom4j.ProcessingInstruction;import org.dom4j.Text;import org.dom4j.VisitorSupport; public class MyVisitor extends VisitorSupport { @Overridepublic void visit(Attribute node) {super.visit(node);} @Overridepublic void visit(CDATA node) {super.visit(node);} @Overridepublic void visit(Comment node) {super.visit(node);} @Overridepublic void visit(Document document) {super.visit(document);} @Overridepublic void visit(DocumentType documentType) {super.visit(documentType);} @Overridepublic void visit(Element node) {super.visit(node);} @Overridepublic void visit(Entity node) {super.visit(node);} @Overridepublic void visit(Namespace namespace) {super.visit(namespace);} @Overridepublic void visit(ProcessingInstruction node) {super.visit(node);} @Overridepublic void visit(Text node) {super.visit(node);}} 实例代码:例如,这里覆写了处理Element的方法@Overridepublic void visit(Element node) {System.out.println(node.asXML());} 实例代码:程序中调用,Element skill = root.element(“skill”);MyVisitor visitor = new MyVisitor();skill.accept(visitor);这样,程序会从skill节点开始,遍历全部子节点和子属性,注释,CDATA等,即遍历skill节点内部的全部元素,由于我的MyVisitor只覆写了Element的处理方法,所以只处理所有的子节点。程序结果:(xml内容见开篇例子)<skill name=”独孤九剑”><info>为独孤求败所创,变化万千,凌厉无比。其传人主要有风清扬、令狐冲。</info></skill><info>为独孤求败所创,变化万千,凌厉无比。其传人主要有风清扬、令狐冲。</info>

清单 1. 示例 XML 文档(catalog.xml)

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<!--An XML Catalog-->
<?target instruction?>
<journal title="XML Zone"
publisher="IBM developerWorks">
<article level="Intermediate" date="December-2001">
<title>Java configuration with XML Schema</title>
<author>
<firstname>Marcello</firstname>
<lastname>Vitaletti</lastname>
</author>
</article>
</journal>
</catalog>

然后使用同一个解析器修改 catalog.xml,清单 2 是修改后的 XML 文档,catalog-modified.xml。

清单 2. 修改后的 XML 文档(catalog-modified.xml)

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<!--An XML catalog-->
<?target instruction?>
<journal title="XML Zone"
publisher="IBM developerWorks">
<article level="Introductory" date="October-2002">
<title>Create flexible and extensible XML schemas</title>
<author>
<firstname>Ayesha</firstname>
<lastname>Malik</lastname>
</author>
</article>
</journal>
</catalog>

与 W3C DOM API 相比,使用 dom4j 所包含的解析器的好处是 dom4j 拥有本地的 XPath 支持。DOM 解析器不支持使用 XPath 选择节点。本文包括以下几个部分:预先设置创建文档修改文档预先设置这个解析器可以从 http://dom4j.org 获取。通过设置使 dom4j-1.4/dom4j-full.jar 能够在 classpath 中访问,该文件中包括 dom4j 类、XPath 引擎以及 SAX 和 DOM 接口。如果已经使用了 JAXP 解析器中包含的 SAX 和 DOM 接口,向 classpath 中增加 dom4j-1.4/dom4j.jar 。 dom4j.jar 包括 dom4j 类和 XPath
引擎,但是不含 SAX 与 DOM 接口。

创建文档本节讨论使用 dom4j API 创建 XML 文档的过程,并创建示例 XML 文档 catalog.xml。使用 import 语句导入 dom4j API 类:import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element; 使用 DocumentHelper 类创建一个文档实例。 DocumentHelper 是生成 XML 文档节点的 dom4j API 工厂类。Document document = DocumentHelper.createDocument(); 使用 addElement() 方法创建根元素 catalog 。 addElement() 用于向 XML 文档中增加元素。Element catalogElement = document.addElement(“catalog”); 在 catalog 元素中使用 addComment() 方法添加注释“An XML catalog”。catalogElement.addComment(“An XML catalog”); 在 catalog 元素中使用 addProcessingInstruction() 方法增加一个处理指令。catalogElement.addProcessingInstruction(“target”,”text”); 在 catalog 元素中使用 addElement() 方法增加 journal 元素。Element journalElement = catalogElement.addElement(“journal”); 使用 addAttribute() 方法向 journal 元素添加 title 和 publisher 属性。journalElement.addAttribute(“title”, “XML Zone”);journalElement.addAttribute(“publisher”, “IBM developerWorks”); 向 article 元素中添加 journal 元素。Element articleElement=journalElement.addElement(“article”); 为 article 元素增加 level 和 date 属性。articleElement.addAttribute(“level”, “Intermediate”);articleElement.addAttribute(“date”, “December-2001”); 向 article 元素中增加 title 元素。Element titleElement=articleElement.addElement(“title”); 使用 setText() 方法设置 article 元素的文本。titleElement.setText(“Java configuration with XML Schema”); 在 article 元素中增加 author 元素。Element authorElement=articleElement.addElement(“author”); 在 author 元素中增加 firstname 元素并设置该元素的文本。Element firstNameElement=authorElement.addElement(“firstname”);firstNameElement.setText(“Marcello”); 在 author 元素中增加 lastname 元素并设置该元素的文本。Element lastNameElement=authorElement.addElement(“lastname”);lastNameElement.setText(“Vitaletti”); 可以使用 addDocType() 方法添加文档类型说明。document.addDocType(“catalog”, null,”file://c:/Dtds/catalog.dtd”); 这样就向 XML 文档中增加文档类型说明:<!DOCTYPE catalog SYSTEM “file://c:/Dtds/catalog.dtd”> 如果文档要使用文档类型定义(DTD)文档验证则必须有 Doctype。XML 声明 <?xml version=”1.0″ encoding=”UTF-8″?> 自动添加到 XML 文档中。清单 3 所示的例子程序 XmlDom4J.java 用于创建 XML 文档 catalog.xml。清单 3. 生成 XML 文档 catalog.xml 的程序(XmlDom4J.java)

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.XMLWriter;
import java.io.*;
public class XmlDom4J{
public void generateDocument(){
Document document = DocumentHelper.createDocument();
Element catalogElement = document.addElement("catalog");
catalogElement.addComment("An XML Catalog");
catalogElement.addProcessingInstruction("target","text");
Element journalElement = catalogElement.addElement("journal");
journalElement.addAttribute("title", "XML Zone");
journalElement.addAttribute("publisher", "IBM developerWorks");
Element articleElement=journalElement.addElement("article");
articleElement.addAttribute("level", "Intermediate");
articleElement.addAttribute("date", "December-2001");
Element titleElement=articleElement.addElement("title");
titleElement.setText("Java configuration with XML Schema");
Element authorElement=articleElement.addElement("author");
Element firstNameElement=authorElement.addElement("firstname");
firstNameElement.setText("Marcello");
Element lastNameElement=authorElement.addElement("lastname");
lastNameElement.setText("Vitaletti");
document.addDocType("catalog",
null,"file://c:/Dtds/catalog.dtd");
try{
XMLWriter output = new XMLWriter(
new FileWriter( new File("c:/catalog/catalog.xml") ));
output.write( document );
output.close();
}
catch(IOException e){System.out.println(e.getMessage());}
}
public static void main(String[] argv){
XmlDom4J dom4j=new XmlDom4J();
dom4j.generateDocument();
}}

这一节讨论了创建 XML 文档的过程,下一节将介绍使用 dom4j API 修改这里创建的 XML 文档。

修改文档这一节说明如何使用 dom4j API 修改示例 XML 文档 catalog.xml。使用 SAXReader 解析 XML 文档 catalog.xml:SAXReader saxReader = new SAXReader();Document document = saxReader.read(inputXml); SAXReader 包含在 org.dom4j.io 包中。inputXml 是从 c:/catalog/catalog.xml 创建的 java.io.File。使用 XPath 表达式从 article 元素中获得 level 节点列表。如果 level 属性值是“Intermediate”则改为“Introductory”。

List list = document.selectNodes("//article/@level" );
Iterator iter=list.iterator();
while(iter.hasNext()){
Attribute attribute=(Attribute)iter.next();
if(attribute.getValue().equals("Intermediate"))
attribute.setValue("Introductory");
}

获取 article 元素列表,从 article 元素中的 title 元素得到一个迭代器,并修改 title 元素的文本。

list = document.selectNodes("//article" );
iter=list.iterator();
while(iter.hasNext()){
Element element=(Element)iter.next();
Iterator iterator=element.elementIterator("title");
while(iterator.hasNext()){
Element titleElement=(Element)iterator.next();
if(titleElement.getText().equals("Java configuration with XML Schema"))
titleElement.setText("Create flexible and extensible XML schema");
}}

通过和 title 元素类似的过程修改 author 元素。清单 4 所示的示例程序 Dom4JParser.java 用于把 catalog.xml 文档修改成 catalog-modified.xml 文档。清单 4. 用于修改 catalog.xml 的程序(Dom4Jparser.java)

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Attribute;
import java.util.List;
import java.util.Iterator;
import org.dom4j.io.XMLWriter;
import java.io.*;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
public class Dom4JParser{
public void modifyDocument(File inputXml){
try{
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(inputXml);
List list = document.selectNodes("//article/@level" );
Iterator iter=list.iterator();
while(iter.hasNext()){
Attribute attribute=(Attribute)iter.next();
if(attribute.getValue().equals("Intermediate"))
attribute.setValue("Introductory");
}
list = document.selectNodes("//article/@date" );
iter=list.iterator();
while(iter.hasNext()){
Attribute attribute=(Attribute)iter.next();
if(attribute.getValue().equals("December-2001"))
attribute.setValue("October-2002");
}
list = document.selectNodes("//article" );
iter=list.iterator();
while(iter.hasNext()){
Element element=(Element)iter.next();
Iterator iterator=element.elementIterator("title");
while(iterator.hasNext()){
Element titleElement=(Element)iterator.next();
if(titleElement.getText().equals("Java configuration with XML
Schema"))
titleElement.setText("Create flexible and extensible XML schema");
}
}
list = document.selectNodes("//article/author" );
iter=list.iterator();
while(iter.hasNext()){
Element element=(Element)iter.next();
Iterator iterator=element.elementIterator("firstname");
while(iterator.hasNext()){
Element firstNameElement=(Element)iterator.next();
if(firstNameElement.getText().equals("Marcello"))
firstNameElement.setText("Ayesha");
}
}
list = document.selectNodes("//article/author" );
iter=list.iterator();
while(iter.hasNext()){
Element element=(Element)iter.next();
Iterator iterator=element.elementIterator("lastname");
while(iterator.hasNext()){
Element lastNameElement=(Element)iterator.next();
if(lastNameElement.getText().equals("Vitaletti"))
lastNameElement.setText("Malik");
}
}
XMLWriter output = new XMLWriter(
new FileWriter( new File("c:/catalog/catalog-modified.xml") ));
output.write( document );
output.close();
}
catch(DocumentException e)
{
System.out.println(e.getMessage());
}
catch(IOException e){
System.out.println(e.getMessage());
}
}
public static void main(String[] argv){
Dom4JParser dom4jParser=new Dom4JParser();
dom4jParser.modifyDocument(new File("c:/catalog/catalog.xml"));
}
}

public void parseXML(){
Document document=null;
try {
document= new SAXReader().read(Thread.currentThread().getContextClassLoader().getResourceAsStream("book.xml"));
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
List books=document.selectNodes("//书/小说");
for(Iterator iter = books.iterator(); iter.hasNext();){
Element element = (Element) iter.next();
System.out.println(element.getName());
System.out.println(element.getText());
System.out.println(element.attributeValue("name"));

转载自:http://www.cnblogs.com/liuchaogege/p/5869044.html

(ps:完美,好文章,不过不知道真正的出处。)

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,484
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,899
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,732
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,485
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,125
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,285