我知道Sax和Dom之间的差异在解析Xml方面非常重要,但是创建一个呢?有没有办法使用Sax创建新的Xml,或者如果我想根据我的程序中的数据创建新的Xml文件,我将不得不使用DOM?
由于
答案 0 :(得分:7)
SAX引用维基百科:
SAX (XML的简单API)是一个序列号 访问XML的解析器 API。
SAX 提供阅读的机制 来自XML文档的数据。
即。 SAX非常适合读取XML文档,但如果你想编写一个,你可能会使用DOM。
答案 1 :(得分:4)
答案 2 :(得分:2)
答案 3 :(得分:2)
SAX用于读取XML文档,而不是编写它们。
另一方面的DOM用于在内存中的结构和XML文档之间创建映射。
如果您已在内存中拥有自己的数据数据结构(这比处理的DOM结构更方便),则创建DOM数据结构意味着复制数据。如果你有大量数据,也许这不是你想要的。此外,在将XML结构写入XML之前,必须完全创建DOM结构,从而使应用程序所需的内存大小加倍。此外,它会在您的处理过程中产生延迟。
我不知道有哪个库可以帮助编写XML文档,但如果我已经使用SAX,拥有自己的数据结构,我就不会为DOM烦恼了。
答案 4 :(得分:1)
DOM是创建文档的自然选择。
答案 5 :(得分:1)
我还没有看过SAX风格的写作API,它仅用于阅读。对于编写您的选项是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")
)
)
;
}
答案 6 :(得分:1)
有时我会使用printf来制作简单的XML,但通常值得使用XML绑定工具,例如: Code Synthesis XSD。这将基于XSD为您创建一个类层次结构。您只需填充对象层次结构,它就会为您创建XML。
通过这种方式,您可以静态检查您的XML是否格式正确且有效,这确实有助于及早发现错误。
如果您曾经使用过JAXB或任何类似的Java工具,那几乎是一样的。
答案 7 :(得分:0)
您可以尝试在您的语言/平台中找到等效的.NET XmlWriter。
答案 8 :(得分:0)
始终使用DOM创建新的XML ...为了阅读目的,更喜欢SAX ..