2010-02-25 67 views
6

我知道Sax和Dom之間的區別對於解析Xml來說相當實用,但是如何創建它們呢?有甚至有一種方法來使用Sax創建新的Xml,或者如果我想根據我的程序中的數據創建新的Xml文件,我將不得不使用DOM?Dom Vs Sax - 創建Xmls

謝謝

回答

7

SAX是,維基百科報價:

SAX (用於XML的簡單API)是串行 訪問解析器 API爲XML。
SAX 提供了一種機制,用於讀取來自XML文檔的 數據。

即SAX對讀取XML文檔非常有用,但如果要編寫一個XML文檔,您可能會使用DOM。

+1

最簡單的方式來創建XML是做字節/串級concatnation ..爲什麼人們想要使用解析API來創建文件? –

+7

做字符串連接,你必須處理逃脫自己(包括CDATA,例如,許多人忘記);這已經是使用API​​的一個很好的理由;;另外,DOM(漂亮)將accros語言標準化,這是一件好事,這將有助於讓你的代碼更易於理解。我見過用於創建XML的蹩腳的「連接」類型代碼... –

1

DOM是創建文檔的自然選擇。

1

我還沒有看到SAX-寫作風格的API來interessted,它僅用於閱讀。編寫你的選項是DOM和各種非標準化的構建器API(通常比DOM更方便使用)。非標準化的API在語言/庫之間不同,但是參見例如Builder for Ruby。我還起草了對C類似的API ++運算符重載:(例子僅僅是測試一個可能的API,它實際上並沒有做任何事情)

#include <string> 

struct XMLBuilder { 
    XMLBuilder& operator[](std::string const& elemName) { return *this; } 
    XMLBuilder& operator()(std::string const& attrName, std::string const& attrValue) { return *this; } 
    XMLBuilder& operator()(std::string const& innerText) { return *this; } 
    XMLBuilder& operator()(XMLBuilder const& innerDoc) { return *this; } 
}; 

int main() { 
    XMLBuilder() 
    ["contact"](XMLBuilder() 
     ["name"]("Patrick Hines") 
     ["phone"]("type", "home")("206-555-0144") 
     ["phone"]("type", "work")("425-555-0145") 
     ["address"](XMLBuilder() 
     ["street"]("...") 
     ["zip"]("12345") 
    ) 
    ) 
    ; 
} 
2

SAX是讀取XML文檔,不寫他們。

另一方面,DOM旨在創建內存中的結構和XML文檔之間的映射。

如果您已經在內存中爲您的數據創建了自己的數據結構(這對於處理來說比DOM結構更方便),創建DOM數據結構將意味着複製數據。如果你有大量數據,這可能不是你想要的。另外,您必須完全創建DOM結構,然後才能將其寫入XML,從而使應用程序所需的內存大小加倍。此外,它會在您的處理中造成延遲。

我不知道可以幫助編寫XML文檔的庫,但是如果我已經在使用SAX,擁有自己的數據結構,那麼我就不會打擾DOM。

1

有時候我會用printf來製作簡單的XML,但通常使用XML綁定工具是很值得的。 Code Synthesis XSD。這將基於XSD爲您創建一個類層次結構。您只需填充一個對象層次結構,它就會爲您創建XML。

通過這種方式,您可以靜態檢查XML是否格式良好且有效,這有助於儘早發現錯誤。

如果您曾經使用JAXB或任何類似的Java工具,它幾乎是一回事。

0

您可以嘗試在您的語言/平臺上找到.NET的XmlWriter的等效項。

0

始終使用DOM來創建新的XML ......對於讀書目的喜歡SAX ..