使用dom4j解析xml
dom4j API下载包括用于解析XML文档的工具。 在本文中,将使用解析器创建示例XML文档。 清单1显示了示例XML文档catalog.xml。
Java configuration with XML Schema
Marcello
Vitaletti
使用解析器修改catalog.xml。 清单2显示了修改后的XML文档catalog-modified.xml。
Create flexible and extensible XML schemas
Ayesha
Malik
与W3C DOM API相比,使用dom4j随附的解析器的优势在于dom4j具有本机XPath支持。 DOM解析器不支持XPath选择节点。
本文分为以下几节:
可以从http://dom4j.org获得此解析器。 使dom4j-1.4/dom4j-full.jar
在类路径中可用; 它包含dom4j类,XPath引擎以及SAX和DOM的接口。 如果正在使用JAXP解析器中包含的SAX和DOM接口,则将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
是一个dom4j API工厂,用于生成XML文档节点。
Document document = DocumentHelper.createDocument();
使用addElement()
方法创建根元素catalog
。 addElement()
用于将元素添加到XML文档。
Element catalogElement = document.addElement("catalog");
使用addComment()
方法创建注释“ An XML catalog”并将其添加到catalog
元素。
catalogElement.addComment("An XML catalog");
使用addProcessingInstruction()
方法将处理指令添加到catalog
元素。
catalogElement.addProcessingInstruction("target","text");
使用addElement()
方法将journal
元素添加到catalog
元素。
Element journalElement = catalogElement.addElement("journal");
使用addAttribute()
方法将title
和publisher
属性添加到journal
元素。
journalElement.addAttribute("title", "XML Zone");
journalElement.addAttribute("publisher", "IBM developerWorks");
将article
元素添加到journal
元素。
Element articleElement=journalElement.addElement("article");
将level
和date
属性添加到article
元素。
articleElement.addAttribute("level", "Intermediate");
articleElement.addAttribute("date", "December-2001");
将title
元素添加到article
元素。
Element titleElement=articleElement.addElement("title");
使用setText()
方法设置article
元素的文本。
titleElement.setText("Java configuration with XML Schema");
将author
元素添加到article
元素。
Element authorElement=articleElement.addElement("author");
将一个firstname
元素添加到author
元素,并设置firstname
元素的文本。
Element firstNameElement=authorElement.addElement("firstname");
firstNameElement.setText("Marcello");
将一个lastname
元素添加到author
元素,并设置lastname
元素的文本。
Element lastNameElement=authorElement.addElement("lastname");
lastNameElement.setText("Vitaletti");
可以使用addDocType()
方法将文档类型语句添加到文档中。
document.addDocType("catalog", null,"file://c:/Dtds/catalog.dtd");
将文档类型语句添加到XML文档:
如果要使用文档类型定义(DTD)文档对文档进行验证,则需要Doctype。
默认情况下,将XML声明添加到XML文档中。
清单3显示了示例程序XmlDom4J.java,该程序用于创建XML文档catalog.xml。
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文档catalog.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
属性值为“中级”,则将其修改为“简介”。
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文档。
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"));
}
}
本节向您展示了如何使用dom4j附带的解析器修改示例XML文档。 该解析器不使用DTD或模式来验证XML文档。 如果需要验证XML文档,请将dom4j与JAXP SAX解析器集成。
dom4j附带的解析器是一种非验证工具,用于解析XML文档。 它可以与JAXP,Crimson或Xerces解析器集成。 本文向您展示了如何使用此解析器创建和修改XML文档。
翻译自: https://www.ibm.com/developerworks/xml/library/x-dom4j/index.html
使用dom4j解析xml