一、DOM4J簡介
DOM4J是dom4j.org出品的一個開源XML解析包,DOM4J最大的特色是使用大量的介面,這也是它被認為比JDOM靈活的主要原因。它的主要介面都在org.dom4j這個包裡定義:
Attribute |
定義了XML屬性 |
Branch |
Branch為能夠包含子節點的節點如XML元素(Element)和文檔(Docuemnts)定義了一個公用的行為 |
CDATA |
定義了XML CDATA 地區 |
CharacterData |
CharacterData是一個標識借口,標識基於字元的節點。如CDATA,Comment, Text. |
Comment |
Comment 定義了XML注釋的行為 |
Document |
定義了XML文檔 |
DocumentType |
DocumentType 定義XML DOCTYPE聲明 |
Element |
Element定義XML 元素 |
ElementHandler |
ElementHandler定義了 Element 對象的處理器 |
ElementPath |
被 ElementHandler 使用,用於取得當前正在處理的路徑層次資訊 |
Entity |
Entity定義 XML entity |
Node |
Node為所有的dom4j中XML節點定義了多態行為 |
NodeFilter |
NodeFilter 定義了在dom4j節點中產生的一個濾鏡或謂詞的行為(predicate) |
ProcessingInstruction |
ProcessingInstruction 定義 XML 處理指示. |
Text |
Text 定義XML 常值節點. |
Visitor |
Visitor 用於實現Visitor模式. |
XPath |
XPath 在分析一個字串後會提供一個XPath 運算式 |
介面之間的繼承關係如下所示:
- interface java.lang.Cloneable
- interface org.dom4j.Node
- interface org.dom4j.Attribute
- interface org.dom4j.Branch
- interface org.dom4j.Document
- interface org.dom4j.Element
- interface org.dom4j.CharacterData
- interface org.dom4j.CDATA
- interface org.dom4j.Comment
- interface org.dom4j.Text
- interface org.dom4j.DocumentType
- interface org.dom4j.Entity
- interface org.dom4j.ProcessingInstruction
二、使用樣本
1。讀取並解析XML文檔
讀寫XML文檔主要依賴於org.dom4j.io包,其中提供DOMReader和SAXReader兩類不同方式,而調用方式是一樣的。
// 從檔案讀取XML,輸入檔案名稱,返回XML文檔
public Document read(String fileName) throws MalformedURLException, DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File(fileName));
return document;
}
其中,reader的read方法是重載的,可以從InputStream, File, Url等多種不同的源來讀取。得到的Document對象就代表了整個XML。注意讀取的字元編碼是按照XML檔案頭定義的編碼來轉換。
2。取得ROOT結點
一切XML分析都是從Root元素開始的。
public Element getRootElement(Document doc){
return doc.getRootElement();
}
3。遍曆XML樹
DOM4J提供至少3種遍曆節點的方法:
1) 枚舉(Iterator)
// 枚舉所有子節點
for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
Element element = (Element) i.next();
// do something
}
// 枚舉名稱為foo的節點
for ( Iterator i = root.elementIterator(foo); i.hasNext();) {
Element foo = (Element) i.next();
// do something
}
// 枚舉屬性
for ( Iterator i = root.attributeIterator(); i.hasNext(); ) {
Attribute attribute = (Attribute) i.next();
// do something
}
2)遞迴
public void treeWalk() {
treeWalk(getRootElement());
}
public void treeWalk(Element element) {
for (int i = 0, size = element.nodeCount(); i < size; i++) {
Node node = element.node(i);
if (node instanceof Element) {
treeWalk((Element) node);
} else { // do something....
}
}
}
3) Visitor模式
Visitor是GOF設計模式之一。其主要原理就是兩種類互相保有對方的引用,並且一種作為Visitor去訪問許多Visitable。只需要自定一個類實現Visitor介面即可。
public class MyVisitor extends VisitorSupport {
public void visit(Element element){
System.out.println(element.getName());
}
public void visit(Attribute attr){
System.out.println(attr.getName());
}
}
調用: root.accept(new MyVisitor())