在本文中,您會了解如何將 DOM 結構轉換成 SAX 和 JDOM,從而可以與不使用 DOM 的應用程序通信。本文列出的代碼演示了如何從 DOM 轉換到供 SAX 使用的輸出流,以及如何從 DOM 到 JDOM 的轉換。
如果您對 W3C 的 DOM(文檔對象模型)感興趣而且認為 SAX 很靈巧的話,那么您必須找出一種方法將 DOM 轉換成應用程序開發人員使用的其它格式。當然,這些其它格式是指 SAX 和 JDOM。如果必須將 DOM 作為輸入且要將它轉換成其它格式時,要做什么?這當然是一個值得研究的問題。由于 DOM 提供了完整的文檔表示,將它轉換成另外一種格式當然是可行的。在本文中,您將了解如何執行從 DOM 到 SAX 或 JDOM 的轉換。
從 DOM 到 SAX
遺憾的是,DOM 級別 1 和更新的級別 2 沒有提供將 DOM 樹輸出成 SAX 或其它格式的方式。結果是每個語法分析器實現都提供了一組用于輸出的定制 API,實現的獨立性喪失了。換句話說,您的代碼只能與那個為它編寫的語法分析器一起工作(如 Crimson、Xerces 或 Oracle 等等)。DOM 級別 3 被認為是提供了這項功能,所以我們都必須靜觀 DOM 級別 3 能提供什么輸出方法。同時,查看一下供應商提供的有關編寫或串行化 DOM 樹的文檔。例如使用 Apache Xerces,需要使用如清單 1 中所示的 org.apache.xml.serialize.XMLSerializer 類。 在每一種情形,您將有可能必須以流的形式輸出 DOM 樹,然后將這個流交給 SAX 進行后續處理。請注意,清單 1 中僅顯示了以流的形式輸出 DOM 樹;然后可以使用這個流作為 SAX 處理器的輸入。
清單 1. 將 DOM 轉換成輸出流(供 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 轉換成 JDOM 要比將 DOM 轉換成 SAX 簡單。這事實上很有意義,因為您一旦有了 DOM 樹,就有可能有機會從 SAX 處理數據。事實上,很少有 SAX 最優處理 DOM 樹的情況,因為您通過 DOM 表示來將 XML 存儲在內存里時,已經用盡了內存。更為常見的工作是把作為 DOM 樹的 XML 文檔轉換成 JDOM 樹。由于這些格式都是文檔表示,但在行為和功能性方面有潛在的不同,所以您可能想讓其他人用您的 DOM 樹并將它當作 JDOM 進行處理。您可能認為這是他們的工作,但您需要知道(至少!)如何從您的結構轉換成他們的結構。
對于將 DOM 轉換成 JDOM,JDOM API 向用戶提供了 DOM Node,稱為 org.jdom.input.DOMBuilder。這個類接受 DOM Document(以及其它一些 DOM 結構,如 Element 和 Attr),并將 DOM 樹轉換成 JDOM Document。這個操作并不復雜,所以我在清單 2 中簡單地顯示了該代碼,讓您了解一下實際過程。
清單 2. 將 DOM 轉換成 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 規范,以了解對于以標準的且與供應商無關的方式輸出 DOM 樹的更改,到那時,您就可以盡情使用 DOM 了!
如果您對 W3C 的 DOM(文檔對象模型)感興趣而且認為 SAX 很靈巧的話,那么您必須找出一種方法將 DOM 轉換成應用程序開發人員使用的其它格式。當然,這些其它格式是指 SAX 和 JDOM。如果必須將 DOM 作為輸入且要將它轉換成其它格式時,要做什么?這當然是一個值得研究的問題。由于 DOM 提供了完整的文檔表示,將它轉換成另外一種格式當然是可行的。在本文中,您將了解如何執行從 DOM 到 SAX 或 JDOM 的轉換。
從 DOM 到 SAX
遺憾的是,DOM 級別 1 和更新的級別 2 沒有提供將 DOM 樹輸出成 SAX 或其它格式的方式。結果是每個語法分析器實現都提供了一組用于輸出的定制 API,實現的獨立性喪失了。換句話說,您的代碼只能與那個為它編寫的語法分析器一起工作(如 Crimson、Xerces 或 Oracle 等等)。DOM 級別 3 被認為是提供了這項功能,所以我們都必須靜觀 DOM 級別 3 能提供什么輸出方法。同時,查看一下供應商提供的有關編寫或串行化 DOM 樹的文檔。例如使用 Apache Xerces,需要使用如清單 1 中所示的 org.apache.xml.serialize.XMLSerializer 類。 在每一種情形,您將有可能必須以流的形式輸出 DOM 樹,然后將這個流交給 SAX 進行后續處理。請注意,清單 1 中僅顯示了以流的形式輸出 DOM 樹;然后可以使用這個流作為 SAX 處理器的輸入。
清單 1. 將 DOM 轉換成輸出流(供 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 轉換成 JDOM 要比將 DOM 轉換成 SAX 簡單。這事實上很有意義,因為您一旦有了 DOM 樹,就有可能有機會從 SAX 處理數據。事實上,很少有 SAX 最優處理 DOM 樹的情況,因為您通過 DOM 表示來將 XML 存儲在內存里時,已經用盡了內存。更為常見的工作是把作為 DOM 樹的 XML 文檔轉換成 JDOM 樹。由于這些格式都是文檔表示,但在行為和功能性方面有潛在的不同,所以您可能想讓其他人用您的 DOM 樹并將它當作 JDOM 進行處理。您可能認為這是他們的工作,但您需要知道(至少!)如何從您的結構轉換成他們的結構。
對于將 DOM 轉換成 JDOM,JDOM API 向用戶提供了 DOM Node,稱為 org.jdom.input.DOMBuilder。這個類接受 DOM Document(以及其它一些 DOM 結構,如 Element 和 Attr),并將 DOM 樹轉換成 JDOM Document。這個操作并不復雜,所以我在清單 2 中簡單地顯示了該代碼,讓您了解一下實際過程。
清單 2. 將 DOM 轉換成 JDOM





























































沒有別的要說了。一旦您知道如何從 DOM 移向 SAX 和 JDOM 之后,就可以解決任何您需要的輸出格式并且能夠處理您將遇到的許多類型的 XML 表示。靜待 DOM 級別 3 規范,以了解對于以標準的且與供應商無關的方式輸出 DOM 樹的更改,到那時,您就可以盡情使用 DOM 了!