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對(duì)Visitor的支持,這樣可以大大縮減代碼量,并且清楚易懂。了解設(shè)計(jì)模式的人都知道,Visitor是GOF設(shè)計(jì)模式之一。其主要原理就是兩種類互相保有對(duì)方的引用,并且一種作為Visitor去訪問許多Visitable。我們來看DOM4J中的Visitor模式(快速文檔中沒有提供)
只需要自定一個(gè)類實(shí)現(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不同的對(duì)象,將采用不同的方式來訪問。上面是給出的Element和Attribute的簡(jiǎn)單實(shí)現(xiàn),一般比較常用的就是這兩個(gè)。VisitorSupport是DOM4J提供的默認(rèn)適配器,Visitor接口的Default Adapter模式,這個(gè)模式給出了各種visit(*)的空實(shí)現(xiàn),以便簡(jiǎn)化代碼。
注意,這個(gè)Visitor是自動(dòng)遍歷所有子節(jié)點(diǎn)的。如果是root.accept(MyVisitor),將遍歷子節(jié)點(diǎn)。我第一次用的時(shí)候,認(rèn)為是需要自己遍歷,便在遞歸中調(diào)用Visitor,結(jié)果可想而知。
4. XPath支持
DOM4J對(duì)XPath有良好的支持,如訪問一個(gè)節(jié)點(diǎn),可直接用XPath選擇。
例如,如果你想查找XHTML文檔中所有的超鏈接,下面的代碼可以實(shí)現(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)換
有時(shí)候經(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)推薦:計(jì)算機(jī)等級(jí)考試二級(jí)Java經(jīng)典算法大全匯總
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |