我知道Sax和Dom之間的區別對於解析Xml來說相當實用,但是如何創建它們呢?有甚至有一種方法來使用Sax創建新的Xml,或者如果我想根據我的程序中的數據創建新的Xml文件,我將不得不使用DOM?Dom Vs Sax - 創建Xmls
謝謝
我知道Sax和Dom之間的區別對於解析Xml來說相當實用,但是如何創建它們呢?有甚至有一種方法來使用Sax創建新的Xml,或者如果我想根據我的程序中的數據創建新的Xml文件,我將不得不使用DOM?Dom Vs Sax - 創建Xmls
謝謝
SAX是,維基百科報價:
SAX (用於XML的簡單API)是串行 訪問解析器 API爲XML。
SAX 提供了一種機制,用於讀取來自XML文檔的 數據。
即SAX對讀取XML文檔非常有用,但如果要編寫一個XML文檔,您可能會使用DOM。
DOM是創建文檔的自然選擇。
另外,還有兩個更值得一提的: * Pull或StaX * VTD-XML –
您需要登錄,爲了閱讀「DOM和SAX投入測試」鏈接,這很糟糕。 – iddober
我還沒有看到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")
)
)
;
}
SAX是讀取XML文檔,不寫他們。
另一方面,DOM旨在創建內存中的結構和XML文檔之間的映射。
如果您已經在內存中爲您的數據創建了自己的數據結構(這對於處理來說比DOM結構更方便),創建DOM數據結構將意味着複製數據。如果你有大量數據,這可能不是你想要的。另外,您必須完全創建DOM結構,然後才能將其寫入XML,從而使應用程序所需的內存大小加倍。此外,它會在您的處理中造成延遲。
我不知道可以幫助編寫XML文檔的庫,但是如果我已經在使用SAX,擁有自己的數據結構,那麼我就不會打擾DOM。
有時候我會用printf來製作簡單的XML,但通常使用XML綁定工具是很值得的。 Code Synthesis XSD。這將基於XSD爲您創建一個類層次結構。您只需填充一個對象層次結構,它就會爲您創建XML。
通過這種方式,您可以靜態檢查XML是否格式良好且有效,這有助於儘早發現錯誤。
如果您曾經使用JAXB或任何類似的Java工具,它幾乎是一回事。
您可以嘗試在您的語言/平臺上找到.NET的XmlWriter的等效項。
始終使用DOM來創建新的XML ......對於讀書目的喜歡SAX ..
最簡單的方式來創建XML是做字節/串級concatnation ..爲什麼人們想要使用解析API來創建文件? –
做字符串連接,你必須處理逃脫自己(包括CDATA,例如,許多人忘記);這已經是使用API的一個很好的理由;;另外,DOM(漂亮)將accros語言標準化,這是一件好事,這將有助於讓你的代碼更易於理解。我見過用於創建XML的蹩腳的「連接」類型代碼... –