隨筆-314  評論-209  文章-0  trackbacks-0

          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 = "James";
          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下載地址

          初次嘗試翻譯,如果有翻譯不妥的地方,希望大家指出來,我們共同進(jìn)步!
          謝謝!!
          [:)]

          posted on 2006-11-17 15:14 xzc 閱讀(433) 評論(0)  編輯  收藏 所屬分類: XMLJava
          主站蜘蛛池模板: 萨嘎县| 麻栗坡县| 沁水县| 宁波市| 明溪县| 诏安县| 恩施市| 保德县| 雅江县| 鹤岗市| 施秉县| 商洛市| 清水县| 阿城市| 揭阳市| 靖西县| 夏河县| 元江| 莆田市| 乌拉特前旗| 新宁县| 兖州市| 开封市| 阳谷县| 凤阳县| 南汇区| 扶风县| 同江市| 刚察县| 舒兰市| 蕉岭县| 廊坊市| 古蔺县| 白沙| 弋阳县| 翁源县| 甘洛县| 施甸县| 保德县| 临江市| 柳河县|