您的位置:首页 > 其它

Dom4j 使用简介

2008-03-24 10:37 323 查看
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left]先看一段dom4j的代码[/align]

importorg.dom4j.Document;
importorg.dom4j.DocumentHelper;
importorg.dom4j.Element;
importorg.dom4j.io.XMLWriter;
importjava.io.*;

publicclassXmlDom4J{
publicvoidgenerateDocument(){
//使用DocumentHelper类创建一个文档实例。DocumentHelper是生成XML文档节点的dom4jAPI工厂类
Documentdocument=DocumentHelper.createDocument();

//使用addElement()方法创建根元素catalog。addElement()用于向XML文档中增加元素
ElementcatalogElement=document.addElement("catalog");

//在catalog元素中使用addComment()方法添加注释“AnXMLcatalog”
catalogElement.addComment("AnXMLCatalog");

//在catalog元素中使用addProcessingInstruction()方法增加一个处理指令
catalogElement.addProcessingInstruction("target","text");

//在catalog元素中使用addElement()方法增加journal元素
ElementjournalElement=catalogElement.addElement("journal");

//使用addAttribute()方法向journal元素添加title和publisher属性
journalElement.addAttribute("title","XMLZone");
journalElement.addAttribute("publisher","IBMdeveloperWorks");

//向article元素中添加journal元素
ElementarticleElement=journalElement.addElement("article");

//为article元素增加level和date属性
articleElement.addAttribute("level","Intermediate");
articleElement.addAttribute("date","December-2001");

//向article元素中增加title元素
ElementtitleElement=articleElement.addElement("title");

//使用setText()方法设置article元素的文本
titleElement.setText("JavaconfigurationwithXMLSchema");

//在article元素中增加author元素
ElementauthorElement=articleElement.addElement("author");

//在author元素中增加firstname元素并设置该元素的文本
ElementfirstNameElement=authorElement.addElement("firstname");
firstNameElement.setText("Marcello");

//在author元素中增加lastname元素并设置该元素的文本
ElementlastNameElement=authorElement.addElement("lastname");
lastNameElement.setText("Vitaletti");

//可以使用addDocType()方法添加文档类型说明
document.addDocType("catalog",null,"file://c:/Dtds/catalog.dtd");

try{
Filefile=newFile("c:/catalog/catalog.xml");
Filedir=newFile("c:/catalog/");
if(file.isDirectory()||!dir.exists()){
dir.mkdirs();
file.createNewFile();
}
System.out.println(dir+"___"+file);
XMLWriteroutput=newXMLWriter(newFileWriter(file));
output.write(document);
output.close();
}catch(IOExceptione){
System.out.println(e.getMessage());
}
}

publicstaticvoidmain(String[]argv){
XmlDom4Jdom4j=newXmlDom4J();
dom4j.generateDocument();
}
}

[align=left][/align]
[align=left][/align]
[align=left]DOM4J是dom4j.org出品的一个开源XML解析包,它的网站中这样定义:[/align]
[align=left]Dom4jisaneasytouse,opensourcelibraryforworkingwithXML,XPathandXSLTontheJavaplatformusingtheJavaCollectionsFrameworkandwithfullsupportforDOM,SAXandJAXP.[/align]
[align=left]Dom4j是一个易用的、开源的库,用于XMLXPathXSLT。它应用于Java平台,采用了Java集合框架并完全支持DOMSAXJAXP[/align]
[align=left]DOM4J使用起来非常简单。只要你了解基本的XML-DOM模型,就能使用。然而他自己带的指南只有短短一页(html),不过说的到挺全。国内的中文资料很少。因而俺写这个短小的教程方便大家使用,这篇文章仅谈及基本的用法,如需深入的使用,请……自己摸索或查找别的资料。[/align]
[align=left]之前看过IBMdeveloper社区的文章(参见附录),提到一些XML解析包的性能比较,其中DOM4J的性能非常出色,在多项测试中名列前茅。(事实上DOM4J的官方文档中也引用了这个比较)所以这次的项目中我采用了DOM4J作为XML解析工具。[/align]
[align=left]在国内比较流行的是使用JDOM作为解析器,两者各擅其长,但DOM4J最大的特色是使用大量的接口,这也是它被认为比JDOM灵活的主要原因。大师不是说过么,“面向接口编程”。目前使用DOM4J的已经越来越多。如果你善于使用JDOM,不妨继续用下去,只看看本篇文章作为了解与比较,如果你正要采用一种解析器,不如就用DOM4J吧。[/align]
[align=left]它的主要接口都在org.dom4j这个包里定义:[/align]

[align=left]Attribute[/align]
[align=left]Attribute定义了XML的属性[/align]
[align=left]Branch[/align]
[align=left]Branch为能够包含子节点的节点如XML元素(Element)和文档(Docuemnts)定义了一个公共的行为,[/align]
[align=left]CDATA[/align]
[align=left]CDATA定义了XMLCDATA区域[/align]
[align=left]CharacterData[/align]
[align=left]CharacterData是一个标识借口,标识基于字符的节点。如CDATA,Comment,Text.[/align]
[align=left]Comment[/align]
[align=left]Comment定义了XML注释的行为[/align]
[align=left]Document[/align]
[align=left]定义了XML文档[/align]
[align=left]DocumentType[/align]
[align=left]DocumentType定义XMLDOCTYPE声明[/align]
[align=left]Element[/align]
[align=left]Element定义XML元素[/align]
[align=left]ElementHandler[/align]
[align=left]ElementHandler定义了Element对象的处理器[/align]
[align=left]ElementPath[/align]
[align=left]被ElementHandler使用,用于取得当前正在处理的路径层次信息[/align]
[align=left]Entity[/align]
[align=left]Entity定义XMLentity[/align]
[align=left]Node[/align]
[align=left]Node为所有的dom4j中XML节点定义了多态行为[/align]
[align=left]NodeFilter[/align]
[align=left]NodeFilter定义了在dom4j节点中产生的一个滤镜或谓词的行为(predicate)[/align]
[align=left]ProcessingInstruction[/align]
[align=left]ProcessingInstruction定义XML处理指令.[/align]
[align=left]Text[/align]
[align=left]Text定义XML文本节点.[/align]
[align=left]Visitor[/align]
[align=left]Visitor用于实现Visitor模式.[/align]
[align=left]XPath[/align]
[align=left]XPath在分析一个字符串后会提供一个XPath表达式[/align]
[align=left]看名字大致就知道它们的涵义如何了。[/align]
[align=left]要想弄懂这套接口,关键的是要明白接口的继承关系:[/align]

interfacejava.lang.Cloneable

interfaceorg.dom4j.Node

interfaceorg.dom4j.Attribute

interfaceorg.dom4j.Branch

interfaceorg.dom4j.Document

interfaceorg.dom4j.Element

interfaceorg.dom4j.CharacterData

interfaceorg.dom4j.CDATA

interfaceorg.dom4j.Comment

interfaceorg.dom4j.Text

interfaceorg.dom4j.DocumentType

interfaceorg.dom4j.Entity

interfaceorg.dom4j.ProcessingInstruction

[align=left]一目了然,很多事情都清楚了。大部分都是由Node继承来的。知道这些关系,将来写程序就不会出现ClassCastException了。[/align]
[align=left]下面给出一些例子(部分摘自DOM4J自带的文档),简单说一下如何使用。[/align]
[align=left]1.读取并解析XML文档:[/align]
[align=left]读写XML文档主要依赖于org.dom4j.io包,其中提供DOMReader和SAXReader两类不同方式,而调用方式是一样的。这就是依靠接口的好处。[/align]
[align=left][/align]
[align=left]//从文件读取XML,输入文件名,返回XML文档[/align]
[align=left]publicDocumentread(StringfileName)throwsMalformedURLException,DocumentException{[/align]
[align=left]SAXReaderreader=newSAXReader();[/align]
[align=left]Documentdocument=reader.read(newFile(fileName));[/align]
[align=left]returndocument;[/align]
[align=left]}[/align]
[align=left][/align]
[align=left]其中,reader的read方法是重载的,可以从InputStream,File,Url等多种不同的源来读取。得到的Document对象就带表了整个XML。[/align]
[align=left]根据本人自己的经验,读取的字符编码是按照XML文件头定义的编码来转换。如果遇到乱码问题,注意要把各处的编码名称保持一致即可。[/align]
[align=left]2.取得Root节点[/align]
[align=left]读取后的第二步,就是得到Root节点。熟悉XML的人都知道,一切XML分析都是从Root元素开始的。[/align]
[align=left][/align]
[align=left] publicElementgetRootElement(Documentdoc){[/align]
[align=left]returndoc.getRootElement();[/align]
[align=left]}[/align]
[align=left][/align]
[align=left]3.遍历XML树[/align]
[align=left]DOM4J提供至少3种遍历节点的方法:[/align]
[align=left]1)枚举(Iterator)[/align]
[align=left][/align]
[align=left]//枚举所有子节点[/align]
[align=left]for(Iteratori=root.elementIterator();i.hasNext();){[/align]
[align=left]Elementelement=(Element)i.next();[/align]
[align=left]//dosomething[/align]
[align=left]}[/align]
[align=left]//枚举名称为foo的节点[/align]
[align=left]for(Iteratori=root.elementIterator(foo);i.hasNext();){[/align]
[align=left]Elementfoo=(Element)i.next();[/align]
[align=left]//dosomething[/align]
[align=left]}[/align]
[align=left]//枚举属性[/align]
[align=left]for(Iteratori=root.attributeIterator();i.hasNext();){[/align]
[align=left]Attributeattribute=(Attribute)i.next();[/align]
[align=left]//dosomething[/align]
[align=left]}[/align]
[align=left]2)递归[/align]
[align=left]递归也可以采用Iterator作为枚举手段,但文档中提供了另外的做法[/align]
[align=left][/align]
[align=left]publicvoidtreeWalk(){[/align]
[align=left]treeWalk(getRootElement());[/align]
[align=left]}[/align]
[align=left]publicvoidtreeWalk(Elementelement){[/align]
[align=left]for(inti=0,size=element.nodeCount();i<size;i++){[/align]
[align=left]Nodenode=element.node(i);[/align]
[align=left]if(nodeinstanceofElement){[/align]
[align=left]treeWalk((Element)node);[/align]
[align=left]}else{//dosomething....[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left][/align]
[align=left]3)Visitor模式[/align]
[align=left]最令人兴奋的是DOM4J对Visitor的支持,这样可以大大缩减代码量,并且清楚易懂。了解设计模式的人都知道,Visitor是GOF设计模式之一。其主要原理就是两种类互相保有对方的引用,并且一种作为Visitor去访问许多Visitable。我们来看DOM4J中的Visitor模式(快速文档中没有提供)[/align]
[align=left]只需要自定一个类实现Visitor接口即可。[/align]
[align=left][/align]
[align=left] publicclassMyVisitorextendsVisitorSupport{[/align]
[align=left]publicvoidvisit(Elementelement){[/align]
[align=left]System.out.println(element.getName());[/align]
[align=left]}[/align]
[align=left]publicvoidvisit(Attributeattr){[/align]
[align=left]System.out.println(attr.getName());[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left][/align]
[align=left]调用:root.accept(newMyVisitor())[/align]
[align=left]Visitor接口提供多种Visit()的重载,根据XML不同的对象,将采用不同的方式来访问。上面是给出的Element和Attribute的简单实现,一般比较常用的就是这两个。VisitorSupport是DOM4J提供的默认适配器,Visitor接口的DefaultAdapter模式,这个模式给出了各种visit(*)的空实现,以便简化代码。[/align]
[align=left]注意,这个Visitor是自动遍历所有子节点的。如果是root.accept(MyVisitor),将遍历子节点。我第一次用的时候,认为是需要自己遍历,便在递归中调用Visitor,结果可想而知。[/align]
[align=left]4.XPath支持[/align]
[align=left]DOM4J对XPath有良好的支持,如访问一个节点,可直接用XPath选择。[/align]
[align=left][/align]
[align=left]publicvoidbar(Documentdocument){[/align]
[align=left]Listlist=document.selectNodes(//foo/bar);[/align]
[align=left]Nodenode=document.selectSingleNode(//foo/bar/author);[/align]
[align=left]Stringname=node.valueOf(@name);[/align]
[align=left]}[/align]
[align=left][/align]
[align=left]例如,如果你想查找XHTML文档中所有的超链接,下面的代码可以实现:[/align]
[align=left][/align]
[align=left]publicvoidfindLinks(Documentdocument)throwsDocumentException{[/align]
[align=left]Listlist=document.selectNodes(//a/@href);[/align]
[align=left]for(Iteratoriter=list.iterator();iter.hasNext();){[/align]
[align=left]Attributeattribute=(Attribute)iter.next();[/align]
[align=left]Stringurl=attribute.getValue();[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left][/align]
[align=left]5.字符串与XML的转换[/align]
[align=left]有时候经常要用到字符串转换为XML或反之,[/align]
[align=left][/align]
[align=left]//XML转字符串[/align]
[align=left] Documentdocument=...;[/align]
[align=left]Stringtext=document.asXML();[/align]
[align=left]//字符串转XML[/align]
[align=left]Stringtext=<person><name>James</name></person>;[/align]
[align=left]Documentdocument=DocumentHelper.parseText(text);[/align]
[align=left][/align]
[align=left]6用XSLT转换XML[/align]
[align=left][/align]
[align=left]publicDocumentstyleDocument([/align]
[align=left]Documentdocument,[/align]
[align=left]Stringstylesheet[/align]
[align=left])throwsException{[/align]
[align=left]//loadthetransformerusingJAXP[/align]
[align=left]TransformerFactoryfactory=TransformerFactory.newInstance();[/align]
[align=left]Transformertransformer=factory.newTransformer([/align]
[align=left]newStreamSource(stylesheet)[/align]
[align=left]);[/align]
[align=left]//nowletsstylethegivendocument[/align]
[align=left]DocumentSourcesource=newDocumentSource(document);[/align]
[align=left]DocumentResultresult=newDocumentResult();[/align]
[align=left]transformer.transform(source,result);[/align]
[align=left]//returnthetransformeddocument[/align]
[align=left]DocumenttransformedDoc=result.getDocument();[/align]
[align=left]returntransformedDoc;[/align]
[align=left]}[/align]
[align=left][/align]
[align=left]7.创建XML[/align]
[align=left]一般创建XML是写文件前的工作,这就像StringBuffer一样容易。[/align]
[align=left][/align]
[align=left]publicDocumentcreateDocument(){[/align]
[align=left]Documentdocument=DocumentHelper.createDocument();[/align]
[align=left]Elementroot=document.addElement(root);[/align]
[align=left]Elementauthor1=[/align]
[align=left]root[/align]
[align=left].addElement(author)[/align]
[align=left].addAttribute(name,James)[/align]
[align=left].addAttribute(location,UK)[/align]
[align=left].addText(JamesStrachan);[/align]
[align=left]Elementauthor2=[/align]
[align=left]root[/align]
[align=left].addElement(author)[/align]
[align=left].addAttribute(name,Bob)[/align]
[align=left].addAttribute(location,US)[/align]
[align=left].addText(BobMcWhirter);[/align]
[align=left]returndocument;[/align]
[align=left]}[/align]
[align=left][/align]
[align=left]8.文件输出[/align]
[align=left]一个简单的输出方法是将一个Document或任何的Node通过write方法输出[/align]
[align=left][/align]
[align=left]FileWriterout=newFileWriter(foo.xml);[/align]
[align=left]document.write(out);[/align]
[align=left][/align]
[align=left]如果你想改变输出的格式,比如美化输出或缩减格式,可以用XMLWriter类[/align]
[align=left][/align]
[align=left]publicvoidwrite(Documentdocument)throwsIOException{[/align]
[align=left]//指定文件[/align]
[align=left]XMLWriterwriter=newXMLWriter([/align]
[align=left]newFileWriter(output.xml)[/align]
[align=left]);[/align]
[align=left]writer.write(document);[/align]
[align=left]writer.close();[/align]
[align=left]//美化格式[/align]
[align=left]OutputFormatformat=OutputFormat.createPrettyPrint();[/align]
[align=left]writer=newXMLWriter(System.out,format);[/align]
[align=left]writer.write(document);[/align]
[align=left]//缩减格式[/align]
[align=left]format=OutputFormat.createCompactFormat();[/align]
[align=left]writer=newXMLWriter(System.out,format);[/align]
[align=left]writer.write(document);[/align]
[align=left]}[/align]
[align=left][/align]
[align=left]如何,DOM4J够简单吧,当然,还有一些复杂的应用没有提到,如ElementHandler等。如果你动心了,那就一起来用DOM4J.[/align]
[align=left]DOM4J官方网站:(我老连不上)[/align]
[align=left]http://www.dom4j.org/[/align]
[align=left]DOM4J下载(SourceForge),最新版本为1.4[/align]
[align=left]http://sourceforge.net/projects/dom4j[/align]

[align=left]用Dom4j解析XML及中文问题[/align]
[align=left]发表于2004年9月27日20:21[/align]
[align=left]本文主要讨论了用dom4j解析XML的基础问题,包括建立XML文档,添加、修改、删除节点,以及格式化(美化)输出和中文问题。可作为dom4j的入门资料。[/align]
[align=left]转载自:http://jalorsoft.com/holen/[/align]
[align=left]作者:陈光(holen@263.net)[/align]
[align=left]时间:2004-09-11[/align]
[align=left][/align]
[align=left]本文主要讨论了用dom4j解析XML的基础问题,包括建立XML文档,添加、修改、删除节点,以及格式化(美化)输出和中文问题。可作为dom4j的入门资料。[/align]
[align=left][/align]
[align=left]1下载与安装[/align]
[align=left][/align]
[align=left]dom4j是sourceforge.net上的一个开源项目,主要用于对XML的解析。从2001年7月发布第一版以来,已陆续推出多个版本,目前最高版本为1.5。[/align]
[align=left]dom4j专门针对Java开发,使用起来非常简单、直观,在Java界,dom4j正迅速普及。[/align]
[align=left][/align]
[align=left]可以到http://sourceforge.net/projects/dom4j下载其最新版。[/align]
[align=left][/align]
[align=left]dom4j1.5的完整版大约13M,是一个名为dom4j-1.5.zip的压缩包,解压后有一个dom4j-1.5.jar文件,这就是应用时需要引入的类包,另外还有一个jaxen-1.1-beta-4.jar文件,一般也需要引入,否则执行时可能抛java.lang.NoClassDefFoundError:org/jaxen/JaxenException异常,其他的包可以选择用之。[/align]
[align=left][/align]
[align=left]2示例XML文档(holen.xml[/align]
[align=left][/align]
[align=left]为了述说方便,先看一个XML文档,之后的操作均以此文档为基础。[/align]
[align=left][/align]

[align=left]holen.xml[/align]
[align=left]<?xmlversion="1.0"encoding="UTF-8"?>[/align]
[align=left]<books>[/align]
[align=left]<!--Thisisatestfordom4j,holen,2004.9.11-->[/align]
[align=left]<bookshow="yes">[/align]
[align=left]<title>Dom4jTutorials</title>[/align]
[align=left]</book>[/align]
[align=left]<bookshow="yes">[/align]
[align=left]<title>LuceneStuding</title>[/align]
[align=left]</book>[/align]
[align=left]<bookshow="no">[/align]
[align=left]<title>LuceneinAction</title>[/align]
[align=left]</book>[/align]
[align=left]<owner>O'Reilly</owner>[/align]
[align=left]</books>[/align]
[align=left][/align]
[align=left]这是一个很简单的XML文档,场景是一个网上书店,有很多书,每本书有两个属性,一个是书名[title],一个为是否展示[show],最后还有一项是这些书的拥有者[owner]信息。[/align]
[align=left][/align]
[align=left]3建立一个XML文档[/align]
[align=left][/align]

[align=left][/align]
[align=left]/**[/align]
[align=left]*建立一个XML文档,文档名由输入属性决定[/align]
[align=left]*@paramfilename需建立的文件名[/align]
[align=left]*@return返回操作结果,0表失败,1表成功[/align]
[align=left]*/[/align]
[align=left]publicintcreateXMLFile(Stringfilename){[/align]
[align=left]/**返回操作结果,0表失败,1表成功*/[/align]
[align=left]intreturnValue=0;[/align]
[align=left]/**建立document对象*/[/align]
[align=left]Documentdocument=DocumentHelper.createDocument();[/align]
[align=left]/**建立XML文档的根books*/[/align]
[align=left]ElementbooksElement=document.addElement("books");[/align]
[align=left]/**加入一行注释*/[/align]
[align=left]booksElement.addComment("Thisisatestfordom4j,holen,2004.9.11");[/align]
[align=left]/**加入第一个book节点*/[/align]
[align=left]ElementbookElement=booksElement.addElement("book");[/align]
[align=left]/**加入show属性内容*/[/align]
[align=left]bookElement.addAttribute("show","yes");[/align]
[align=left]/**加入title节点*/[/align]
[align=left]ElementtitleElement=bookElement.addElement("title");[/align]
[align=left]/**为title设置内容*/[/align]
[align=left]titleElement.setText("Dom4jTutorials");[/align]
[align=left][/align]
[align=left]/**类似的完成后两个book*/[/align]
[align=left]bookElement=booksElement.addElement("book");[/align]
[align=left]bookElement.addAttribute("show","yes");[/align]
[align=left]titleElement=bookElement.addElement("title");[/align]
[align=left]titleElement.setText("LuceneStuding");[/align]
[align=left]bookElement=booksElement.addElement("book");[/align]
[align=left]bookElement.addAttribute("show","no");[/align]
[align=left]titleElement=bookElement.addElement("title");[/align]
[align=left]titleElement.setText("LuceneinAction");[/align]
[align=left][/align]
[align=left]/**加入owner节点*/[/align]
[align=left]ElementownerElement=booksElement.addElement("owner");[/align]
[align=left]ownerElement.setText("O'Reilly");[/align]
[align=left][/align]
[align=left]try{[/align]
[align=left]/**将document中的内容写入文件中*/[/align]
[align=left]XMLWriterwriter=newXMLWriter(newFileWriter(newFile(filename)));[/align]
[align=left]writer.write(document);[/align]
[align=left]writer.close();[/align]
[align=left]/**执行成功,需返回1*/[/align]
[align=left]returnValue=1;[/align]
[align=left]}catch(Exceptionex){[/align]
[align=left]ex.printStackTrace();[/align]
[align=left]}[/align]
[align=left][/align]
[align=left]returnreturnValue;[/align]
[align=left]}[/align]
[align=left][/align]
[align=left]说明:[/align]
[align=left]Documentdocument=DocumentHelper.createDocument();[/align]
[align=left]通过这句定义一个XML文档对象。[/align]
[align=left][/align]
[align=left]ElementbooksElement=document.addElement("books");[/align]
[align=left]通过这句定义一个XML元素,这里添加的是根节点。[/align]
[align=left]Element有几个重要的方法:[/align]
[align=left]laddComment:添加注释[/align]
[align=left]laddAttribute:添加属性[/align]
[align=left]laddElement:添加子元素[/align]
[align=left][/align]
[align=left]最后通过XMLWriter生成物理文件,默认生成的XML文件排版格式比较乱,可以通过OutputFormat类的createCompactFormat()方法或createPrettyPrint()方法格式化输出,默认采用createCompactFormat()方法,显示比较紧凑,这点将在后面详细谈到。[/align]
[align=left][/align]
[align=left]生成后的holen.xml文件内容如下:[/align]
[align=left][/align]

[align=left][/align]
[align=left]<?xmlversion="1.0"encoding="UTF-8"?>[/align]
[align=left]<books><!--Thisisatestfordom4j,holen,2004.9.11--><bookshow="yes"><title>Dom4jTutorials</title></book><bookshow="yes"><title>LuceneStuding</title></book><bookshow="no"><title>LuceneinAction</title></book><owner>O'Reilly</owner></books>[/align]
[align=left][/align]
[align=left]4修改XML文档[/align]
[align=left][/align]
[align=left]有三项修改任务,依次为:[/align]
[align=left]l如果book节点中show属性的内容为yes,则修改成no[/align]
[align=left]l把owner项内容改为Tshinghua,并添加date节点[/align]
[align=left]l若title内容为Dom4jTutorials,则删除该节点[/align]
[align=left][/align]

[align=left][/align]
[align=left]/**[/align]
[align=left]*修改XML文件中内容,并另存为一个新文件[/align]
[align=left]*重点掌握dom4j中如何添加节点,修改节点,删除节点[/align]
[align=left]*@paramfilename修改对象文件[/align]
[align=left]*@paramnewfilename修改后另存为该文件[/align]
[align=left]*@return返回操作结果,0表失败,1表成功[/align]
[align=left]*/[/align]
[align=left]publicintModiXMLFile(Stringfilename,Stringnewfilename){[/align]
[align=left]intreturnValue=0;[/align]
[align=left]try{[/align]
[align=left]SAXReadersaxReader=newSAXReader();[/align]
[align=left]Documentdocument=saxReader.read(newFile(filename));[/align]
[align=left]/**修改内容之一:如果book节点中show属性的内容为yes,则修改成no*/[/align]
[align=left]/**先用xpath查找对象*/[/align]
[align=left]Listlist=document.selectNodes("/books/book/@show");[/align]
[align=left]Iteratoriter=list.iterator();[/align]
[align=left]while(iter.hasNext()){[/align]
[align=left]Attributeattribute=(Attribute)iter.next();[/align]
[align=left]if(attribute.getValue().equals("yes")){[/align]
[align=left]attribute.setValue("no");[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left][/align]
[align=left]/**[/align]
[align=left]*修改内容之二:把owner项内容改为Tshinghua[/align]
[align=left]*并在owner节点中加入date节点,date节点的内容为2004-09-11,还为date节点添加一个属性type[/align]
[align=left]*/[/align]
[align=left]list=document.selectNodes("/books/owner");[/align]
[align=left]iter=list.iterator();[/align]
[align=left]if(iter.hasNext()){[/align]
[align=left]ElementownerElement=(Element)iter.next();[/align]
[align=left]ownerElement.setText("Tshinghua");[/align]
[align=left]ElementdateElement=ownerElement.addElement("date");[/align]
[align=left]dateElement.setText("2004-09-11");[/align]
[align=left]dateElement.addAttribute("type","Gregoriancalendar");[/align]
[align=left]}[/align]
[align=left][/align]
[align=left]/**修改内容之三:若title内容为Dom4jTutorials,则删除该节点*/[/align]
[align=left]list=document.selectNodes("/books/book");[/align]
[align=left]iter=list.iterator();[/align]
[align=left]while(iter.hasNext()){[/align]
[align=left]ElementbookElement=(Element)iter.next();[/align]
[align=left]Iteratoriterator=bookElement.elementIterator("title");[/align]
[align=left]while(iterator.hasNext()){[/align]
[align=left]ElementtitleElement=(Element)iterator.next();[/align]
[align=left]if(titleElement.getText().equals("Dom4jTutorials")){[/align]
[align=left]bookElement.remove(titleElement);[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left][/align]
[align=left]try{[/align]
[align=left]/**将document中的内容写入文件中*/[/align]
[align=left]XMLWriterwriter=newXMLWriter(newFileWriter(newFile(newfilename)));[/align]
[align=left]writer.write(document);[/align]
[align=left]writer.close();[/align]
[align=left]/**执行成功,需返回1*/[/align]
[align=left]returnValue=1;[/align]
[align=left]}catch(Exceptionex){[/align]
[align=left]ex.printStackTrace();[/align]
[align=left]}[/align]
[align=left][/align]
[align=left]}catch(Exceptionex){[/align]
[align=left]ex.printStackTrace();[/align]
[align=left]}[/align]
[align=left]returnreturnValue;[/align]
[align=left]}[/align]
[align=left][/align]
[align=left][/align]
[align=left]说明:[/align]
[align=left]Listlist=document.selectNodes("/books/book/@show");[/align]
[align=left]list=document.selectNodes("/books/book");[/align]
[align=left]上述代码通过xpath查找到相应内容。[/align]
[align=left][/align]
[align=left]通过setValue()、setText()修改节点内容。[/align]
[align=left][/align]
[align=left]通过remove()删除节点或属性。[/align]
[align=left][/align]
[align=left]5格式化输出和指定编码[/align]
[align=left][/align]
[align=left]默认的输出方式为紧凑方式,默认编码为UTF-8,但对于我们的应用而言,一般都要用到中文,并且希望显示时按自动缩进的方式的显示,这就需用到OutputFormat类。[/align]
[align=left][/align]

[align=left][/align]
[align=left][/align]
[align=left]/**[/align]
[align=left]*格式化XML文档,并解决中文问题[/align]
[align=left]*@paramfilename[/align]
[align=left]*@return[/align]
[align=left]*/[/align]
[align=left]publicintformatXMLFile(Stringfilename){[/align]
[align=left]intreturnValue=0;[/align]
[align=left]try{[/align]
[align=left]SAXReadersaxReader=newSAXReader();[/align]
[align=left]Documentdocument=saxReader.read(newFile(filename));[/align]
[align=left]XMLWriterwriter=null;[/align]
[align=left]/**格式化输出,类型IE浏览一样*/[/align]
[align=left]OutputFormatformat=OutputFormat.createPrettyPrint();[/align]
[align=left]/**指定XML编码*/[/align]
[align=left]format.setEncoding("GBK");[/align]
[align=left]writer=newXMLWriter(newFileWriter(newFile(filename)),format);[/align]
[align=left]writer.write(document);[/align]
[align=left]writer.close();[/align]
[align=left]/**执行成功,需返回1*/[/align]
[align=left]returnValue=1;[/align]
[align=left]}catch(Exceptionex){[/align]
[align=left]ex.printStackTrace();[/align]
[align=left]}[/align]
[align=left]returnreturnValue;[/align]
[align=left]}[/align]
[align=left][/align]
[align=left]说明:[/align]
[align=left][/align]
[align=left]OutputFormatformat=OutputFormat.createPrettyPrint();[/align]
[align=left]这句指定了格式化的方式为缩进式,则非紧凑式。[/align]
[align=left][/align]
[align=left]format.setEncoding("GBK");[/align]
[align=left]指定编码为GBK。[/align]
[align=left][/align]
[align=left]XMLWriterwriter=newXMLWriter(newFileWriter(newFile(filename)),format);[/align]
[align=left]这与前面两个方法相比,多加了一个OutputFormat对象,用于指定显示和编码方式。[/align]
[align=left][/align]
[align=left]6完整的类代码[/align]
[align=left][/align]
[align=left]前面提出的方法都是零散的,下面给出完整类代码。[/align]
[align=left][/align]

[align=left]Dom4jDemo.java[/align]
[align=left]packagecom.holen.dom4j;[/align]
[align=left][/align]
[align=left]importjava.io.File;[/align]
[align=left]importjava.io.FileWriter;[/align]
[align=left]importjava.util.Iterator;[/align]
[align=left]importjava.util.List;[/align]
[align=left][/align]
[align=left]importorg.dom4j.Attribute;[/align]
[align=left]importorg.dom4j.Document;[/align]
[align=left]importorg.dom4j.DocumentHelper;[/align]
[align=left]importorg.dom4j.Element;[/align]
[align=left]importorg.dom4j.io.OutputFormat;[/align]
[align=left]importorg.dom4j.io.SAXReader;[/align]
[align=left]importorg.dom4j.io.XMLWriter;[/align]
[align=left][/align]
[align=left]/**[/align]
[align=left]*@authorHolenChen[/align]
如果是UTF-8
FileWriter改用FileOutputStream

Java代码



XMLWriterwriter;

try{

OutputFormatformat=OutputFormat.createPrettyPrint();

//format.setEncoding("UTF-8");

FileOutputStreamfos=newFileOutputStream(xmlFile);

//writer=newXMLWriter(newFileWriter(xmlFile),format);

writer=newXMLWriter(fos,format);

writer.write(document);

writer.close();

}catch(IOExceptione){

//TODO自动生成catch块

logger.error("修改xml文件失败!");

e.printStackTrace();

}


================================================================================
[align=left]Dom4j使用简介[/align]
[align=left]作者:冰云icecloud(AT)sina.com[/align]
[align=left]时间:2003.12.15[/align]

[align=left][/align]
[align=left]版权声明:[/align]
[align=left]本文由冰云完成,首发于CSDN,未经许可,不得使用于任何商业用途。[/align]
[align=left]文中代码部分引用自DOM4J文档。[/align]
[align=left]欢迎转载,但请保持文章及版权声明完整。[/align]
[align=left]如需联络请发邮件:icecloud(AT)sina.com[/align]
[align=left][/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: