dom4j

  • 格式:doc
  • 大小:61.50 KB
  • 文档页数:14

一、Loading XML Data以下代码从File 中或一个URL 中读取一个XML 文件,并产生一个Document 对象。

一个Document 对象表示了内存中的一棵XML 树,可以在这个XML 树中进行遍历、查询、修改等操作。

import java.io.*;import .*;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.io.SAXReader;public class XMLLoader {private Document doc = null;public void parseWithSAX(File file)throws MalformedURLException,DocumentException {SAXReader xmlReader = new SAXReader();this.doc = xmlReader.read(file);return;}public void parseWithSAX(URL url)throws MalformedURLException,DocumentException {SAXReader xmlReader = new SAXReader();this.doc = xmlReader.read(url);return;}}二、QName and NamespaceQName对象表示了一个XML元素或属性的qualified name,即一个namespace和一个local name的二元组。

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

/******************** SAMPLE XML FILE ************************* <heavyz:Samplexmlns:heavyz="/schema/sample.xsd"><heavyz:HelloWorld/></heavyz:Sample>************************************************************* /public void printRootQNameInfo(Document doc) {Element root = doc.getRootElement();QName qname = root.getQName();System.out.println("local name : " + qname.getName()); System.out.println("namespace prefix: " +qname.getNamespacePrefix());System.out.println("namespace URI : " +qname.getNamespaceURI());System.out.println("qualified name : " +qname.getQualifiedName());return;}/************************* OUTPUT*****************************localname : Samplenamespace prefix: heavyznamespace URI :/schema/sample.xsdqualified name : heavyz:Sample************************************************************* /可以调用Namespace(String prefix, String uri)构造方法构造一个新的Namespace对象;也可以调用Namespace.get(String prefix, String uri)静态方法获得一个新的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 树。

public void printXMLTree(Document doc) {Element root = doc.getRootElement();printElement(root,0);return;}private void printElement(Element element, int level) {// print indentfor (int i=0; i<level; i++) {System.out.print(" ");}System.out.println(element.getQualifiedName());Iterator iter = element.elementIterator();while (iter.hasNext()) {Element sub = (Element)iter.next();printElement(sub,level+2);}return;}四、Getting Information from an Element可以通过Element类提供的方法访问一个XML元素中含有的信息:Method CommentgetQName()元素的QName对象getNamespace()元素所属的Namespace对象getNamespacePrefix()元素所属的Namespace对象的prefix getNamespaceURI()元素所属的Namespace对象的URI getName()元素的local namegetQualifiedName()元素的qualified namegetText()元素所含有的text内容,如果内容为空则返回一个空字符串而不是nullgetTextTrim()元素所含有的text内容,其中连续的空格被转化为单个空格,该方法不会返回nullattributeIterator()元素属性的iterator,其中每个元素都是Attribute对象attributeValue()元素的某个指定属性所含的值elementIterator()元素的子元素的iterator,其中每个元素都是Element对象element()元素的某个指定(qualified name或者local name)的子元素elementText()元素的某个指定(qualified name或者local name)的子元素中的text信息getParent元素的父元素getPath()元素的XPath表达式,其中父元素的qualified name和子元素的qualified name之间使用"/"分隔isTextOnly()是否该元素只含有text或是空元素isRootElement()是否该元素是XML树的根节点要取出Element对象中某个属性的信息,可以调用attributeIterator()方法获得一个Attribute对象的iterator,然后再遍历它。

也可以直接调用attributeValue()方法获得指定属性的值。

该方法接受四种类型的参数:∙attributeValue(QName qname):通过指定qualified name获得属性值,如果无法找到指定的属性,则返回null。

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

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

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

对于一个Attribute对象,可以使用它的以下方法访问其中的信息:Method CommentgetQName()属性的QName对象getNamespace()属性所属的Namespace对象getNamespacePrefix()属性所属的Namespace对象的prefix getNamespaceURI()属性所属的Namespace对象的URI getName()属性的local namegetQualifiedName()属性的qualified namegetValue()属性的值五、Writing an XML Tree to OutputStreamDom4j通过XMLWriter将由Document对象表示的XML树写入一个文件,并使用OutputFormat格式对象指定写入的风格和编码方法。

调用OutputFormat.createPrettyPrint()方法可以获得一个默认的pretty print风格的格式对象。

对OutputFormat对象调用setEncoding()方法可以指定XML文件的编码方法。

public void writeTo(OutputStream out, String encoding) throws UnsupportedEncodingException, IOException {OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("gb2312");XMLWriter writer = new XMLWriter(System.out,format);writer.write(doc);writer.flush();return;}六、Creating an XML Tree使用DocumentFactory对象创建一个空的Document对象。