Dom4j 学习笔记

Loading XML Data

以下代码从 File中或一个 URL中读取一个XML文件,并产生一个 Document对象。一个 Document对象表示了内存中的一棵XML树,可以在这个XML树中进行遍历、查询、修改等操作。
  
  
  
  
import java.io.*;
import java.net.*;
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;
        }
}

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 indent
         for ( 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 Comment
getQName() 元素的QName对象
getNamespace() 元素所属的Namespace对象
getNamespacePrefix() 元素所属的Namespace对象的prefix
getNamespaceURI() 元素所属的Namespace对象的URI
getName() 元素的local name
getQualifiedName() 元素的qualified name
getText() 元素所含有的text内容,如果内容为空则返回一个空字符串而不是null
getTextTrim() 元素所含有的text内容,其中连续的空格被转化为单个空格,该方法不会返回null
attributeIterator() 元素属性的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 Comment
getQName() 属性的QName对象
getNamespace() 属性所属的Namespace对象
getNamespacePrefix() 属性所属的Namespace对象的prefix
getNamespaceURI() 属性所属的Namespace对象的URI
getName() 属性的local name
getQualifiedName() 属性的qualified name
getValue() 属性的值

Writing an XML Tree to OutputStream

Dom4j通过 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对象。 DocumentFactory对象由 DocumentFactory.getInstance()静态方法产生。对 Document对象调用 addElement()方法将创建XML根节点,并将该节点返回。也可以手工创建一个 Element对象并调用 Document.setRootElement()方法把它设置为根节点
   
   
   
   
import org.dom4j.DocumentFactory;
import org.dom4j.Document;
import org.dom4j.Element;

public class XMLSaver {
        
         private DocumentFactory factory = null;
         private Document doc = null;
         private Element root = null;
        
         public XMLSaver() {
                factory = DocumentFactory.getInstance();
                doc = factory.createDocument();
        }
        
         public Element generateRoot(String name) {
                root = doc.addElement(name);
                 return root;
        }
        
         public Element generateRoot(QName qname) {
                root = doc.addElement(qname);
                 return root;
        }
        
         public Element generateRoot(Element element) {
                doc.setRootElement(element);
                root = element;
                 return root;
        }
}
                

Adding Information into an Element

Element通过 addElement()为自己增加一个子节点到当前所有子节点的后面。该方法可以接受三种不同类型的参数: (QName qname)(String name)或者 (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( "James Strachan");
        
         return;
}
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( "James Strachan");
        
         return;
}

Deleting Elements and Attributes

要删除XML树上的一棵子树,首先要找到该子树的根节点,然后对该节点调用 detach()方法。注意:如果对根节点调用了 detach()方法,将导致该XML树不再完整(一个XML文件需要有且仅有一个根节点)。
   
   
   
   
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( "James Strachan");
        
         return;
}
要清除 Element下的所有子节点(包括 Element和text),可以对该 Element调用 clearContent()方法。该方法不会清除 Element的属性。
要清除 Element下的某个 Attribute,首先要获得该 Attribute对象,然后把它作为参数调用 Elementremove()方法。

Updating an Attribute

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

Updating an Element's Text

可以对一个 Element对象调用 isTextOnly()方法判断它是否只含有text或者是空节点。对 Element对象调用 addText()方法将把一个字符串附加到 Element中,但不会修改它原来拥有的text或者子节点。如果 ElementisTextOnly(),要修改原来含有的text,可以先调用 clearContent(),再调用 addText()并把新值传入。
  
  
  
  
public void updateText(Element element, String newText) {
         if (element.isTextOnly()) {
                element.clearContent();
                element.addText(newText);
        }
         return;
}


本篇文章转载自http://heavyz.sourceforge.net/homepage/homepage_zh/comp/notes/dom4j.html,谢谢原文章的作者.

你可能感兴趣的:(职场,休闲)