[收藏]dom4j(Version 1.6.1)快速入門

          Posted on 2006-04-05 12:35 ikingqu 閱讀(317) 評論(0)  編輯  收藏 所屬分類: JavaSE&JavaEEOthers
          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里標(biāo)準(zhǔn)的迭代器(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
          ????????}
          ?????}

          強(qiáng)大的XPath導(dǎo)航


          ????在dom4j中XPath可以表示出在XML樹狀結(jié)構(gòu)中的Document或者任意的節(jié)點(diǎn)(Node)(例如:Attribute,Element?或者ProcessingInstruction等)。它可以使在文檔中復(fù)雜的操作僅通過一行代碼就可以完成。例如:

          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();
          ????????}
          ????}

          ????如果你需要關(guān)于XPath語言的任何幫助,我們強(qiáng)烈推薦這個站點(diǎn)Zvon?tutorial他會通過一個一個的例子引導(dǎo)你學(xué)習(xí)。

          快速遍歷(Fast?Looping)



          如果你不得不遍歷一個非常大的XML文檔,然后才去執(zhí)行,我們建議你使用快速遍歷方法(fast?looping?method),它可以避免為每一個循環(huán)的節(jié)點(diǎn)創(chuàng)建一個迭代器對象,如下所示:

          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文檔對象,下面的程序?yàn)槟氵M(jìn)行了示范:

          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();


          ????????//?以一種優(yōu)雅的格式寫入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?);
          ????}
          }

          轉(zhuǎn)化為字符串,或者從字符串轉(zhuǎn)化


          ????如果你有一個文檔(Document)對象或者任何一個節(jié)點(diǎn)(Node)對象的引用(reference),象屬性(Attribute)或者元素(Element),你可以通過asXML()方法把它轉(zhuǎn)化為一個默認(rèn)的XML字符串:

          ????????Document?document?=?...;
          ????????String?text?=?document.asXML();

          如果你有一些XML內(nèi)容的字符串表示,你可以通過DocumentHelper.parseText()方法將它重新轉(zhuǎn)化為文檔(Document)對象:

          ????????String?text?=?"<person>?<name>James</name>?</person>";
          ????????Document?document?=?DocumentHelper.parseText(text);

          通過XSLT樣式化文檔(Document)



          ????使用Sun公司提供的JAXP?API將XSLT?應(yīng)用到文檔(Document)上是很簡單的。它允許你使用任何的XSLT引擎(例如:Xalan或SAXON等)來開發(fā)。下面是一個使用JAXP創(chuàng)建一個轉(zhuǎn)化器(transformer),然后將它應(yīng)用到文檔(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?加載轉(zhuǎn)化器
          ????????TransformerFactory?factory?=?TransformerFactory.newInstance();
          ????????Transformer?transformer?=?factory.newTransformer(?
          ????????????new?StreamSource(?stylesheet?)?
          ????????);

          ????????//?現(xiàn)在來樣式化一個文檔(Document)
          ????????DocumentSource?source?=?new?DocumentSource(?document?);
          ????????DocumentResult?result?=?new?DocumentResult();
          ????????transformer.transform(?source,?result?);

          ????????//?返回經(jīng)過樣式化的文檔(Document)
          ????????Document?transformedDoc?=?result.getDocument();
          ????????return?transformedDoc;
          ????}
          }

          原文地址
          dom4j下載地址

          posts - 4, comments - 5, trackbacks - 0, articles - 60

          Copyright © ikingqu

          主站蜘蛛池模板: 翁源县| 白玉县| 元谋县| 辽中县| 新绛县| 南木林县| 皮山县| 濮阳县| 阿克陶县| 南宁市| 游戏| 嘉禾县| 广灵县| 绩溪县| 麻江县| 甘孜| 长葛市| 师宗县| 门源| 宁河县| 满洲里市| 尉氏县| 长葛市| 罗江县| 绿春县| 南溪县| 郴州市| 永泰县| 新绛县| 建水县| 宜昌市| 西乌珠穆沁旗| 海南省| 如东县| 布尔津县| 云安县| 秦安县| 射阳县| 临澧县| 蒙自县| 灯塔市|