溫馨蟲窩

          給自己一個溫馨的家

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            2 Posts :: 4 Stories :: 2 Comments :: 0 Trackbacks
          在本文中,您會了解如何將 DOM 結(jié)構(gòu)轉(zhuǎn)換成 SAX 和 JDOM,從而可以與不使用 DOM 的應(yīng)用程序通信。本文列出的代碼演示了如何從 DOM 轉(zhuǎn)換到供 SAX 使用的輸出流,以及如何從 DOM 到 JDOM 的轉(zhuǎn)換。

          如果您對 W3C 的 DOM(文檔對象模型)感興趣而且認(rèn)為 SAX 很靈巧的話,那么您必須找出一種方法將 DOM 轉(zhuǎn)換成應(yīng)用程序開發(fā)人員使用的其它格式。當(dāng)然,這些其它格式是指 SAX 和 JDOM。如果必須將 DOM 作為輸入且要將它轉(zhuǎn)換成其它格式時,要做什么?這當(dāng)然是一個值得研究的問題。由于 DOM 提供了完整的文檔表示,將它轉(zhuǎn)換成另外一種格式當(dāng)然是可行的。在本文中,您將了解如何執(zhí)行從 DOM 到 SAX 或 JDOM 的轉(zhuǎn)換。

          從 DOM 到 SAX
          遺憾的是,DOM 級別 1 和更新的級別 2 沒有提供將 DOM 樹輸出成 SAX 或其它格式的方式。結(jié)果是每個語法分析器實(shí)現(xiàn)都提供了一組用于輸出的定制 API,實(shí)現(xiàn)的獨(dú)立性喪失了。換句話說,您的代碼只能與那個為它編寫的語法分析器一起工作(如 Crimson、Xerces 或 Oracle 等等)。DOM 級別 3 被認(rèn)為是提供了這項(xiàng)功能,所以我們都必須靜觀 DOM 級別 3 能提供什么輸出方法。同時,查看一下供應(yīng)商提供的有關(guān)編寫或串行化 DOM 樹的文檔。例如使用 Apache Xerces,需要使用如清單 1 中所示的 org.apache.xml.serialize.XMLSerializer 類。 在每一種情形,您將有可能必須以流的形式輸出 DOM 樹,然后將這個流交給 SAX 進(jìn)行后續(xù)處理。請注意,清單 1 中僅顯示了以流的形式輸出 DOM 樹;然后可以使用這個流作為 SAX 處理器的輸入。

          清單 1. 將 DOM 轉(zhuǎn)換成輸出流(供 SAX 使用)
          import org.apache.xerces.parsers.DOMParser;
          import org.apache.xml.serialize.XMLSerializer;
          import org.xml.sax.InputSource;
          import org.w3c.dom.Document;

          public class PrintDOMTree {

          public static void main(String[] args) {
          try {
          InputSource source = new InputSource(args[0]);
          DOMParser parser = new DOMParser();
          parser.parse(source);
          Document doc = parser.getDocument();

          XMLSerializer serializer = new XMLSerializer();
          // Insert your PipedOutputStream here instead of System.out!
          serializer.setOutputByteStream(System.out);
          serializer.serialize(doc);
          } catch (Exception e) {
          e.printStackTrace();
          }
          }

          }




          從 DOM 到 JDOM
          將 DOM 轉(zhuǎn)換成 JDOM 要比將 DOM 轉(zhuǎn)換成 SAX 簡單。這事實(shí)上很有意義,因?yàn)槟坏┯辛?DOM 樹,就有可能有機(jī)會從 SAX 處理數(shù)據(jù)。事實(shí)上,很少有 SAX 最優(yōu)處理 DOM 樹的情況,因?yàn)槟ㄟ^ DOM 表示來將 XML 存儲在內(nèi)存里時,已經(jīng)用盡了內(nèi)存。更為常見的工作是把作為 DOM 樹的 XML 文檔轉(zhuǎn)換成 JDOM 樹。由于這些格式都是文檔表示,但在行為和功能性方面有潛在的不同,所以您可能想讓其他人用您的 DOM 樹并將它當(dāng)作 JDOM 進(jìn)行處理。您可能認(rèn)為這是他們的工作,但您需要知道(至少!)如何從您的結(jié)構(gòu)轉(zhuǎn)換成他們的結(jié)構(gòu)。

          對于將 DOM 轉(zhuǎn)換成 JDOM,JDOM API 向用戶提供了 DOM Node,稱為 org.jdom.input.DOMBuilder。這個類接受 DOM Document(以及其它一些 DOM 結(jié)構(gòu),如 Element 和 Attr),并將 DOM 樹轉(zhuǎn)換成 JDOM Document。這個操作并不復(fù)雜,所以我在清單 2 中簡單地顯示了該代碼,讓您了解一下實(shí)際過程。

          清單 2. 將 DOM 轉(zhuǎn)換成 JDOM
          // Java imports
          import java.io.IOException;

          // JDOM imports
          import org.jdom.JDOMException;
          import org.jdom.input.DOMBuilder; 
          import org.jdom.output.XMLOutputter; 

          // SAX and DOM
          import org.xml.sax.InputSource;

          // Xerces
          import org.apache.xerces.parsers.DOMParser;

          public class DOMtoJDOM {

          // DOM tree of input document
          org.w3c.dom.Document domDoc;

          public DOMtoJDOM(String systemID) throws Exception {
          DOMParser parser 
          = new DOMParser();
          parser.parse(
          new InputSource(systemID));
          domDoc 
          = parser.getDocument();
          }


          public org.jdom.Document convert() 
          throws JDOMException, IOException 
          {

          // Create new DOMBuilder, using default parser
          DOMBuilder builder = new DOMBuilder();
          org.jdom.Document jdomDoc 
          = builder.build(domDoc);
          return jdomDoc;
          }


          public static void main(String[] args) {
          try {
          DOMtoJDOM tester 
          = new DOMtoJDOM(args[0]);
          org.jdom.Document jdomDoc 
          = tester.convert();

          // Output the document to System.out
          XMLOutputter outputter = new XMLOutputter();
          outputter.output(jdomDoc, System.
          out);
          }
           catch (Exception e) {
          e.printStackTrace();
          }

          }


          }
           




          沒有別的要說了。一旦您知道如何從 DOM 移向 SAX 和 JDOM 之后,就可以解決任何您需要的輸出格式并且能夠處理您將遇到的許多類型的 XML 表示。靜待 DOM 級別 3 規(guī)范,以了解對于以標(biāo)準(zhǔn)的且與供應(yīng)商無關(guān)的方式輸出 DOM 樹的更改,到那時,您就可以盡情使用 DOM 了!
          posted on 2005-03-01 14:45 溫馨蟲窩 閱讀(178) 評論(0)  編輯  收藏 所屬分類: XML
          主站蜘蛛池模板: 集安市| 奉节县| 庆元县| 临高县| 绵阳市| 舒兰市| 惠来县| 娱乐| 开平市| 措美县| 耿马| 马尔康县| 镇原县| 滦平县| 芮城县| 噶尔县| 平江县| 怀化市| 江永县| 衢州市| 额敏县| 邹城市| 安泽县| 旬邑县| 呼伦贝尔市| 聊城市| 行唐县| 苍山县| 油尖旺区| 兰溪市| 广东省| 巴青县| 左云县| 庆元县| 武城县| 滕州市| 郓城县| 新野县| 礼泉县| 绥阳县| 湖北省|