Dom4j學習筆記

來源:互聯網
上載者:User

標籤:style   http   io   ar   使用   sp   for   java   strong   

一、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;
}
}

 

二、QName and Namespace

     QName對象表示了一個XML元素或屬性的qualified name,即一個namespace和一個local name的二元組。

Namespace對象表示了QName二元組中的namespace部分,它由prefix和URI兩部分組成。

 

/******************** SAMPLE XML FILE *************************
<heavyz:Sample
xmlns:heavyz="http://www.heavyzheng.com/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 : Sample
namespace prefix: heavyz
namespace URI : http://www.heavyzheng.com/schema/sample.xsd
qualified 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 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 字元串而不是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;
}
八、Deleting Elements and Attributes

     要刪除XML樹上的一棵子樹,首先要找到該子樹的根節點,然後對該節點調用detach()方法。注意:如果對根節點調用了detach()方法,將導致該XML樹不再完整(一個XML檔案需要有且僅有一個根節點)。

 

public void deleteSubtree(Element subtreeRoot) {
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;
}

Dom4j學習筆記

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.