Dom4j 学习笔记

Loading XML Data

以下代码从File中或一个URL中读取一个XML文件,并产生一个Document对象。一个Document对象表示了内存中的一棵XML树,

可以在这个XML树中进行遍历、查询、修改等操作。

importjava.io.*;

importjava.net.*;

importorg.dom4j.Document;

importorg.dom4j.DocumentException;

import org.dom4j.io.SAXReader;

public class XMLLoader {

privateDocumentdoc=null;

publicvoidparseWithSAX(Filefile)

throwsMalformedURLException,DocumentException{

SAXReaderxmlReader=newSAXReader();

this.doc=xmlReader.read(file);

return;

}

publicvoidparseWithSAX(URLurl)

throwsMalformedURLException,DocumentException{

SAXReaderxmlReader=newSAXReader();

this.doc=xmlReader.read(url);

return;

}

}

QNameandNamespace

QName对象表示了一个XML元素或属性的qualified name,即一个namespace和一个local name的二元组。

Namespace对象表示了QName二元组中的namespace部分,它由prefix和URI两部分组成。

/********************SAMPLEXMLFILE*************************

<heavyz:Sample

xmlns:heavyz="http://www.heavyzheng.com/schema/sample.xsd">

<heavyz:HelloWorld/>

</heavyz:Sample>

*************************************************************/

publicvoidprintRootQNameInfo(Documentdoc){

Elementroot=doc.getRootElement();

QNameqname=root.getQName();

System.out.println("localname:"+qname.getName());

System.out.println("namespaceprefix:"+qname.getNamespacePrefix());

System.out.println("namespaceURI:"+qname.getNamespaceURI());

System.out.println("qualifiedname:"+qname.getQualifiedName());

return;

}

/************************* OUTPUT *****************************

localname:Sample

namespaceprefix:heavyz

namespaceURI:http://www.heavyzheng.com/schema/sample.xsd

qualifiedname:heavyz:Sample

*************************************************************/

可以调用Namespace(Stringprefix,Stringuri)构造方法构造一个新的Namespace对象;也可以调用Namespace.get(Stringprefix,Stringuri)静态方法

获得一个新的Namespace对象。

可以调用QName(String name)构造方法构造一个没有namespace的qualified name;或者调用QName(String name, Namespace namespace)构造方法构造一个有namespace的qualified name。

Navigating Through an XML Tree

对Document对象调用getRootElement()方法可以返回代表根节点的Element对象。拥有了一个Element对象后,可以对该对象调用elementIterator()方法获得

它的子节点的Element对象们的一个iterator。使用(Element)iterator.next()方法遍历一个iterator并把每个取出的元素转化为Element类型。

通过递归的方法,以下代码可以根据Document对象打印出完整的XML树。

publicvoidprintXMLTree(Documentdoc){

Elementroot=doc.getRootElement();

printElement(root,0);

return;

}

privatevoidprintElement(Elementelement,intlevel){

//printindent

for(inti=0;i<level;i++){

System.out.print("");

}

System.out.println(element.getQualifiedName());

Iteratoriter=element.elementIterator();

while(iter.hasNext()){

Elementsub=(Element)iter.next();

printElement(sub,level+2);

}

return;

}

GettingInformationfromanElement

可以通过Element类提供的方法访问一个XML元素中含有的信息:MethodComment

getQName()元素的QName对象

getNamespace()元素所属的Namespace对象

getNamespacePrefix()元素所属的Namespace对象的prefix

getNamespaceURI()元素所属的Namespace对象的URI

getName()元素的localname

getQualifiedName()元素的qualifiedname

getText()元素所含有的text内容,如果内容为空则返回一个空字符串而不是null

getTextTrim()元素所含有的text内容,其中连续的空格被转化为单个空格,该方法不会返回null

attributeIterator()元素属性的iterator,其中每个元素都是Attribute对象

attributeValue()元素的某个指定属性所含的值

elementIterator()元素的子元素的iterator,其中每个元素都是Element对象

element()元素的某个指定(qualifiedname或者localname)的子元素

elementText()元素的某个指定(qualifiedname或者localname)的子元素中的text信息

getParent元素的父元素

getPath()元素的XPath表达式,其中父元素的qualifiedname和子元素的qualifiedname之间使用"/"分隔

isTextOnly()是否该元素只含有text或是空元素

isRootElement() 是否该元素是XML树的根节点

要取出Element对象中某个属性的信息,可以调用attributeIterator()方法获得一个Attribute对象的iterator,然后再遍历它。也可以直接调用attributeValue()

方法获得指定属性的值。该方法接受四种类型的参数:

attributeValue(QName qname):通过指定qualified name获得属性值,如果无法找到指定的属性,则返回null。

attributeValue(QNameqname,StringdefaultValue):通过指定qualifiedname获得属性值,如果无法找到指定的属性,则返回defaultValue。

attributeValue(Stringname):通过指定localname获得属性值,而忽略属性的namespace,如果无法找到指定的属性,则返回null。

attributeValue(String name, String defaultValue):通过指定local name获得属性值,而忽略属性的namespace,如果无法找到指定的属性,则返回defaultValue。

对于一个Attribute对象,可以使用它的以下方法访问其中的信息: Method Comment

getQName()属性的QName对象

getNamespace()属性所属的Namespace对象

getNamespacePrefix()属性所属的Namespace对象的prefix

getNamespaceURI()属性所属的Namespace对象的URI

getName()属性的localname

getQualifiedName()属性的qualifiedname

getValue() 属性的值

WritinganXMLTreetoOutputStream

Dom4j通过XMLWriter将由Document对象表示的XML树写入一个文件,并使用OutputFormat格式对象指定写入的风格和编码方法。调用OutputFormat.createPrettyPrint()

方法可以获得一个默认的pretty print风格的格式对象。对OutputFormat对象调用setEncoding()方法可以指定XML文件的编码方法。

publicvoidwriteTo(OutputStreamout,Stringencoding)

throwsUnsupportedEncodingException,IOException{

OutputFormatformat=OutputFormat.createPrettyPrint();

format.setEncoding("gb2312");

XMLWriterwriter=newXMLWriter(System.out,format);

writer.write(doc);

writer.flush();

return;

}

CreatinganXMLTree

使用DocumentFactory对象创建一个空的Document对象。DocumentFactory对象由DocumentFactory.getInstance()静态方法产生。对Document对象调用addElement()

方法将创建XML根节点,并将该节点返回。也可以手工创建一个Element对象并调用Document.setRootElement()方法把它设置为根节点

importorg.dom4j.DocumentFactory;

importorg.dom4j.Document;

import org.dom4j.Element;

public class XMLSaver {

privateDocumentFactoryfactory=null;

privateDocumentdoc=null;

privateElementroot=null;

publicXMLSaver(){

factory=DocumentFactory.getInstance();

doc=factory.createDocument();

}

publicElementgenerateRoot(Stringname){

root=doc.addElement(name);

returnroot;

}

publicElementgenerateRoot(QNameqname){

root=doc.addElement(qname);

returnroot;

}

publicElementgenerateRoot(Elementelement){

doc.setRootElement(element);

root=element;

returnroot;

}

}

AddingInformationintoanElement

Element通过addElement()为自己增加一个子节点到当前所有子节点的后面。该方法可以接受三种不同类型的参数:(QNameqname)、(Stringname)或者

(String qualifiedName, String namespaceURI)。该方法返回增加的子节点的Element对象。

Element通过addAttribute()为自己增加属性。该方法可以接受两种不同类型的参数:(QName qname, String value)或者(String name, String value)。该方法返回自身的Element对象。

Element通过addText()为自己增加文本内容。该方法只接受String类型参数,并返回自身的Element对象。

public void addAuthors(Element bookElement) {

    Element author1 = bookElement.addElement("author");

author1.addAttribute("name","Toby");

author1.addAttribute("location","Germany");

    author1.addText("Tobias Rademacher");

    Element author2 = bookElement.addElement("author");

author2.addAttribute("name","James");

author2.addAttribute("name","UK");

author2.addText("JamesStrachan");

return;

}

DeletingElementsandAttributes

要删除XML树上的一棵子树,首先要找到该子树的根节点,然后对该节点调用detach()方法。注意:如果对根节点调用了detach()方法,将导致该XML树不再完整

(一个XML文件需要有且仅有一个根节点)。

publicvoiddeleteSubtree(ElementsubtreeRoot){

subtreeRoot.detach();

return;

}

要清除Element下的所有子节点(包括Element和text),可以对该Element调用clearContent()方法。该方法不会清除Element的属性。

要清除Element下的某个Attribute,首先要获得该Attribute对象,然后把它作为参数调用Element的remove()方法。

Updating an Attribute要更新一个属性的内容,首先要获得该Attribute对象,然后可以调用setNamespace()方法更新它所属的namespace;调用setValue()方法更新它的属性值。

Updating an Element's Text

可以对一个Element对象调用isTextOnly()方法判断它是否只含有text或者是空节点。对Element对象调用addText()方法将把一个字符串附加到Element中,

但不会修改它原来拥有的text或者子节点。如果Element是isTextOnly(),要修改原来含有的text,可以先调用clearContent(),再调用addText()并把新值传入。

public void updateText(Element element, String newText) {

if(element.isTextOnly()){

element.clearContent();

element.addText(newText);

}

return;

}

相关推荐