Parsing?XML
????或許你想要做的第一件事情就是解析一個某種類型的XML文檔,用dom4j很容易做到。請看下面的示范代碼:
import?java.net.URL;
import?org.dom4j.Document;
import?org.dom4j.DocumentException;
import?org.dom4j.io.SAXReader;
public?class?Foo?{
????public?Document?parse(URL?url)?throws?DocumentException?{
????????SAXReader?reader?=?new?SAXReader();
????????Document?document?=?reader.read(url);
????????return?document;
????}
}
使用迭代器(Iterators)
????我們可以通過多種方法來操作XML文檔,這些方法返回java里標準的迭代器(Iterators)。例如:
public?void?bar(Document?document)?throws?DocumentException?{
????????Element?root?=?document.getRootElement();
????????//迭代根元素下面的所有子元素
????????for?(?Iterator?i?=?root.elementIterator();?i.hasNext();?)?{
????????????Element?element?=?(Element)?i.next();
????????????//處理代碼
????????}
????????//迭代根元素下面名稱為"foo"的子元素
????????for?(?Iterator?i?=?root.elementIterator(?"foo"?);?i.hasNext();?)?{
????????????Element?foo?=?(Element)?i.next();
????????????//處理代碼
????????}
????????//?迭代根元素的屬性attributes)元素
????????for?(?Iterator?i?=?root.attributeIterator();?i.hasNext();?)?{
????????????Attribute?attribute?=?(Attribute)?i.next();
????????????//?do?something
????????}
?????}
強大的XPath導航
????在dom4j中XPath可以表示出在XML樹狀結構中的Document或者任意的節點(Node)(例如:Attribute,Element?或者ProcessingInstruction等)。它可以使在文檔中復雜的操作僅通過一行代碼就可以完成。例如:
public?void?bar(Document?document)?{
????????List?list?=?document.selectNodes(?"http://foo/bar"?);
????????Node?node?=?document.selectSingleNode(?"http://foo/bar/author"?);
????????String?name?=?node.valueOf(?"@name"?);
????}
????如果你想得到一個XHTML文檔中的所有超文本鏈接(hypertext?links)你可以使用下面的代碼:
????public?void?findLinks(Document?document)?throws?DocumentException?{
????????List?list?=?document.selectNodes(?"http://a/@href"?);
????????for?(Iterator?iter?=?list.iterator();?iter.hasNext();?)?{
????????????Attribute?attribute?=?(Attribute)?iter.next();
????????????String?url?=?attribute.getValue();
????????}
????}
????如果你需要關于XPath語言的任何幫助,我們強烈推薦這個站點
Zvon?tutorial他會通過一個一個的例子引導你學習。
快速遍歷(Fast?Looping)
如果你不得不遍歷一個非常大的XML文檔,然后才去執行,我們建議你使用快速遍歷方法(fast?looping?method),它可以避免為每一個循環的節點創建一個迭代器對象,如下所示:
public?void?treeWalk(Document?document)?{
????????treeWalk(?document.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....
????????????}
????????}
????}
生成一個新的XML文檔對象
????在dom4j中你可能常常希望用程序生成一個XML文檔對象,下面的程序為你進行了示范:
import?org.dom4j.Document;
import?org.dom4j.DocumentHelper;
import?org.dom4j.Element;
public?class?Foo?{
????public?Document?createDocument()?{
????????Document?document?=?DocumentHelper.createDocument();
????????Element?root?=?document.addElement(?"root"?);
????????Element?author1?=?root.addElement(?"author"?)
????????????.addAttribute(?"name",?"James"?)
????????????.addAttribute(?"location",?"UK"?)
????????????.addText(?"James?Strachan"?);
????????
????????Element?author2?=?root.addElement(?"author"?)
????????????.addAttribute(?"name",?"Bob"?)
????????????.addAttribute(?"location",?"US"?)
????????????.addText(?"Bob?McWhirter"?);
????????return?document;
????}
}
將一個文檔對象寫入文件中
????將一個文檔對象寫入Writer對象的一個簡單快速的途徑是通過write()方法。
????????FileWriter?out?=?new?FileWriter(?"foo.xml"?);
????????document.write(?out?);
如果你想改變輸出文件的排版格式,比如你想要一個漂亮的格式或者是一個緊湊的格式,或者你想用Writer?對象或者OutputStream?對象來操作,那么你可以使用XMLWriter?類。
import?org.dom4j.Document;
import?org.dom4j.io.OutputFormat;
import?org.dom4j.io.XMLWriter;
public?class?Foo?{
????public?void?write(Document?document)?throws?IOException?{
????????//?寫入文件
????????XMLWriter?writer?=?new?XMLWriter(
????????????new?FileWriter(?"output.xml"?)
????????);
????????writer.write(?document?);
????????writer.close();
????????//?以一種優雅的格式寫入System.out對象
????????OutputFormat?format?=?OutputFormat.createPrettyPrint();
????????writer?=?new?XMLWriter(?System.out,?format?);
????????writer.write(?document?);
????????//?以一種緊湊的格式寫入System.out對象
????????format?=?OutputFormat.createCompactFormat();
????????writer?=?new?XMLWriter(?System.out,?format?);
????????writer.write(?document?);
????}
}
轉化為字符串,或者從字符串轉化
????如果你有一個文檔(Document)對象或者任何一個節點(Node)對象的引用(reference),象屬性(Attribute)或者元素(Element),你可以通過asXML()方法把它轉化為一個默認的XML字符串:
????????Document?document?=?...;
????????String?text?=?document.asXML();
如果你有一些XML內容的字符串表示,你可以通過DocumentHelper.parseText()方法將它重新轉化為文檔(Document)對象:
????????String?text?=?"<person>?<name>James</name>?</person>";
????????Document?document?=?DocumentHelper.parseText(text);
通過XSLT樣式化文檔(Document)
????使用Sun公司提供的
JAXP?API將XSLT?應用到文檔(Document)上是很簡單的。它允許你使用任何的XSLT引擎(例如:Xalan或SAXON等)來開發。下面是一個使用JAXP創建一個轉化器(transformer),然后將它應用到文檔(Document)上的例子:
import?javax.xml.transform.Transformer;
import?javax.xml.transform.TransformerFactory;
import?org.dom4j.Document;
import?org.dom4j.io.DocumentResult;
import?org.dom4j.io.DocumentSource;
public?class?Foo?{
????public?Document?styleDocument(
????????Document?document,?
????????String?stylesheet
????)?throws?Exception?{
????????//?使用?JAXP?加載轉化器
????????TransformerFactory?factory?=?TransformerFactory.newInstance();
????????Transformer?transformer?=?factory.newTransformer(?
????????????new?StreamSource(?stylesheet?)?
????????);
????????//?現在來樣式化一個文檔(Document)
????????DocumentSource?source?=?new?DocumentSource(?document?);
????????DocumentResult?result?=?new?DocumentResult();
????????transformer.transform(?source,?result?);
????????//?返回經過樣式化的文檔(Document)
????????Document?transformedDoc?=?result.getDocument();
????????return?transformedDoc;
????}
}
原文地址dom4j下載地址