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文档。