2)遞歸
遞歸也可以采用Iterator作為枚舉手段,但文檔中提供了另外的做法
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模式
最令人興奮的是DOM4J對Visitor的支持,這樣可以大大縮減代碼量,并且清楚易懂。了解設(shè)計模式的人都知道,Visitor是GOF設(shè)計模式之一。其主要原理就是兩種類互相保有對方的引用,并且一種作為Visitor去訪問許多Visitable。我們來看DOM4J中的Visitor模式(快速文檔中沒有提供)
只需要自定一個類實現(xiàn)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());
}
}
調(diào)用: root.accept(new MyVisitor())
Visitor接口提供多種Visit()的重載,根據(jù)XML不同的對象,將采用不同的方式來訪問。上面是給出的Element和Attribute的簡單實現(xiàn),一般比較常用的就是這兩個。VisitorSupport是DOM4J提供的默認(rèn)適配器,Visitor接口的Default Adapter模式,這個模式給出了各種visit(*)的空實現(xiàn),以便簡化代碼。
注意,這個Visitor是自動遍歷所有子節(jié)點的。如果是root.accept(MyVisitor),將遍歷子節(jié)點。我第一次用的時候,認(rèn)為是需要自己遍歷,便在遞歸中調(diào)用Visitor,結(jié)果可想而知。
4. XPath支持
DOM4J對XPath有良好的支持,如訪問一個節(jié)點,可直接用XPath選擇。
例如,如果你想查找XHTML文檔中所有的超鏈接,下面的代碼可以實現(xiàn):
public void bar(Document document) {
List list = document.selectNodes( //foo/bar );
Node node = document.selectSingleNode(//foo/bar/author);
String name = node.valueOf( @name );
}
public void findLinks(Document document) throws DocumentException {
List list = document.selectNodes( //a/@href );
for (Iterator iter = list.iterator(); iter.hasNext(); ) {
Attribute attribute = (Attribute) iter.next();
String url = attribute.getValue();
}
}
5. 字符串與XML的轉(zhuǎn)換
有時候經(jīng)常要用到字符串轉(zhuǎn)換為XML或反之,
6 用XSLT轉(zhuǎn)換XML
// XML轉(zhuǎn)字符串
Document document = ...;
String text = document.asXML();
// 字符串轉(zhuǎn)XML
String text = James ;
Document document = DocumentHelper.parseText(text);
public Document styleDocument(
Document document,
String stylesheet
) throws Exception {
// load the transformer using JAXP
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(
new StreamSource( stylesheet )
);
相關(guān)推薦:北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |