標籤: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學習筆記