dom4j用法

dom4jAPI包含一个解析XML文档的工具。本文中将使用这个解析器创建一个示例XML文档。清单1显示了这个示例XML文档,catalog.xml。

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

<?xmlversion="1.0"encoding="UTF-8"?>

<catalog>

<!--AnXMLCatalog-->

<?targetinstruction?>

<journaltitle="XMLZone"

publisher="IBMdeveloperWorks">

<articlelevel="Intermediate"date="December-2001">

<title>JavaconfigurationwithXMLSchema</title>

<author>

<firstname>Marcello</firstname>

<lastname>Vitaletti</lastname>

</author>

</article>

</journal>

</catalog>

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

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

<?xmlversion="1.0"encoding="UTF-8"?>

<catalog>

<!--AnXMLcatalog-->

<?targetinstruction?>

<journaltitle="XMLZone"

publisher="IBMdeveloperWorks">

<articlelevel="Introductory"date="October-2002">

<title>CreateflexibleandextensibleXMLschemas</title>

<author>

<firstname>Ayesha</firstname>

<lastname>Malik</lastname>

</author>

</article>

</journal>

</catalog>

与W3CDOMAPI相比,使用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接口。

--------------------------------------------------------------------------------

回页首

创建文档

本节讨论使用dom4jAPI创建XML文档的过程,并创建示例XML文档catalog.xml。

使用import语句导入dom4jAPI类:

importorg.dom4j.Document;

importorg.dom4j.DocumentHelper;

importorg.dom4j.Element;

使用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");

这样就向XML文档中增加文档类型说明:

<!DOCTYPEcatalogSYSTEM"file://c:/Dtds/catalog.dtd">

如果文档要使用文档类型定义(DTD)文档验证则必须有Doctype。

XML声明<?xmlversion="1.0"encoding="UTF-8"?>自动添加到XML文档中。

清单3所示的例子程序XmlDom4J.java用于创建XML文档catalog.xml。

清单3.生成XML文档catalog.xml的程序(XmlDom4J.java)

importorg.dom4j.Document;

importorg.dom4j.DocumentHelper;

importorg.dom4j.Element;

importorg.dom4j.io.XMLWriter;

importjava.io.*;

publicclassXmlDom4J{

publicvoidgenerateDocument(){

Documentdocument=DocumentHelper.createDocument();

ElementcatalogElement=document.addElement("catalog");

catalogElement.addComment("AnXMLCatalog");

catalogElement.addProcessingInstruction("target","text");

ElementjournalElement=catalogElement.addElement("journal");

journalElement.addAttribute("title","XMLZone");

journalElement.addAttribute("publisher","IBMdeveloperWorks");

ElementarticleElement=journalElement.addElement("article");

articleElement.addAttribute("level","Intermediate");

articleElement.addAttribute("date","December-2001");

ElementtitleElement=articleElement.addElement("title");

titleElement.setText("JavaconfigurationwithXMLSchema");

ElementauthorElement=articleElement.addElement("author");

ElementfirstNameElement=authorElement.addElement("firstname");

firstNameElement.setText("Marcello");

ElementlastNameElement=authorElement.addElement("lastname");

lastNameElement.setText("Vitaletti");

document.addDocType("catalog",

null,"file://c:/Dtds/catalog.dtd");

try{

XMLWriteroutput=newXMLWriter(

newFileWriter(newFile("c:/catalog/catalog.xml")));

output.write(document);

output.close();

}

catch(IOExceptione){System.out.println(e.getMessage());}

}

publicstaticvoidmain(String[]argv){

XmlDom4Jdom4j=newXmlDom4J();

dom4j.generateDocument();

}}

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

--------------------------------------------------------------------------------

回页首

修改文档

这一节说明如何使用dom4jAPI修改示例XML文档catalog.xml。

使用SAXReader解析XML文档catalog.xml:

SAXReadersaxReader=newSAXReader();

Documentdocument=saxReader.read(inputXml);

SAXReader包含在org.dom4j.io包中。

inputXml是从c:/catalog/catalog.xml创建的java.io.File。使用XPath表达式从article元素中获得level节点列表。如果level属性值是“Intermediate”则改为“Introductory”。

Listlist=document.selectNodes("//article/@level");

Iteratoriter=list.iterator();

while(iter.hasNext()){

Attributeattribute=(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()){

Elementelement=(Element)iter.next();

Iteratoriterator=element.elementIterator("title");

while(iterator.hasNext()){

ElementtitleElement=(Element)iterator.next();

if(titleElement.getText().equals("JavaconfigurationwithXMLSchema"))

titleElement.setText("CreateflexibleandextensibleXMLschema");

}}

通过和title元素类似的过程修改author元素。

清单4所示的示例程序Dom4JParser.java用于把catalog.xml文档修改成catalog-modified.xml文档。

清单4.用于修改catalog.xml的程序(Dom4Jparser.java)

importorg.dom4j.Document;

importorg.dom4j.Element;

importorg.dom4j.Attribute;

importjava.util.List;

importjava.util.Iterator;

importorg.dom4j.io.XMLWriter;

importjava.io.*;

importorg.dom4j.DocumentException;

importorg.dom4j.io.SAXReader;

publicclassDom4JParser{

publicvoidmodifyDocument(FileinputXml){

try{

SAXReadersaxReader=newSAXReader();

Documentdocument=saxReader.read(inputXml);

Listlist=document.selectNodes("//article/@level");

Iteratoriter=list.iterator();

while(iter.hasNext()){

Attributeattribute=(Attribute)iter.next();

if(attribute.getValue().equals("Intermediate"))

attribute.setValue("Introductory");

}

list=document.selectNodes("//article/@date");

iter=list.iterator();

while(iter.hasNext()){

Attributeattribute=(Attribute)iter.next();

if(attribute.getValue().equals("December-2001"))

attribute.setValue("October-2002");

}

list=document.selectNodes("//article");

iter=list.iterator();

while(iter.hasNext()){

Elementelement=(Element)iter.next();

Iteratoriterator=element.elementIterator("title");

while(iterator.hasNext()){

ElementtitleElement=(Element)iterator.next();

if(titleElement.getText().equals("JavaconfigurationwithXML

Schema"))

titleElement.setText("CreateflexibleandextensibleXMLschema");

}

}

list=document.selectNodes("//article/author");

iter=list.iterator();

while(iter.hasNext()){

Elementelement=(Element)iter.next();

Iteratoriterator=element.elementIterator("firstname");

while(iterator.hasNext()){

ElementfirstNameElement=(Element)iterator.next();

if(firstNameElement.getText().equals("Marcello"))

firstNameElement.setText("Ayesha");

}

}

list=document.selectNodes("//article/author");

iter=list.iterator();

while(iter.hasNext()){

Elementelement=(Element)iter.next();

Iteratoriterator=element.elementIterator("lastname");

while(iterator.hasNext()){

ElementlastNameElement=(Element)iterator.next();

if(lastNameElement.getText().equals("Vitaletti"))

lastNameElement.setText("Malik");

}

}

XMLWriteroutput=newXMLWriter(

newFileWriter(newFile("c:/catalog/catalog-modified.xml")));

output.write(document);

output.close();

}

catch(DocumentExceptione)

{

System.out.println(e.getMessage());

}

catch(IOExceptione){

System.out.println(e.getMessage());

}

}

publicstaticvoidmain(String[]argv){

Dom4JParserdom4jParser=newDom4JParser();

dom4jParser.modifyDocument(newFile("c:/catalog/catalog.xml"));

}

}

这一节说明了如何使用dom4j中的解析器修改示例XML文档。这个解析器不使用DTD或者模式验证XML文档。如果XML文档需要验证,可以解释用dom4j与JAXPSAX解析器。

--------------------------------------------------------------------------------

回页首

结束语

包含在dom4j中的解析器是一种用于解析XML文档的非验证性工具,可以与JAXP、Crimson或Xerces集成。本文说明了如何使用该解析器创建和修改XML文档。

相关推荐