我知道 Sax 和 Dom 之间在解析 Xml 方面的区别相当大,但是创建一个呢?有没有办法使用 Sax 创建新的 Xml,或者如果我想根据程序中的数据创建新的 Xml 文件,我将不得不使用 DOM?
谢谢
SAX 是,引用维基百科:
SAX (Simple API for XML)是一个用于 XML 的串行访问解析器API。
SAX 提供了一种从 XML 文档中读取数据的机制。
即 SAX 非常适合读取 XML 文档,但如果您想编写一个,您可能会使用 DOM。
您可以使用 SAX 创建 XML。请参阅以下内容:
http://code.google.com/p/jlibs/wiki/XMLDocument
它是在 Java 中的。但同样可以用 C++ 来实现;
您也可能对 SAX 和 DOM 解析器有什么区别感兴趣
DOM和SAX 经受考验
SAX 用于读取 XML 文档,而不是编写它们。
另一方面,DOM 旨在创建内存结构和 XML 文档之间的映射。
如果您已经在内存中拥有自己的数据结构(这比 DOM 结构更方便您的处理),那么创建 DOM 数据结构将意味着复制您的数据。如果您有大量数据,也许这不是您想要的。此外,您必须先完全创建 DOM 结构,然后才能将其写入 XML,从而使应用程序所需的内存大小增加一倍。此外,它会在您的处理过程中产生延迟。
我不知道有什么库可以帮助编写 XML 文档,但如果我已经在使用 SAX,拥有自己的数据结构,我就不会为 DOM 烦恼。
DOM 是创建文档的自然选择。
我还没有见过 SAX 风格的编写 API,它是只读的。用于编写选项的是 DOM 和各种非标准化的构建器 API(通常比 DOM 更方便使用)。非标准化的 API 因语言/库而异,但请参见Ruby 的 Builder。我还为具有运算符重载的 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")
)
)
;
}
有时我只会使用 printf 来制作简单的 XML,但通常值得使用 XML 绑定工具,例如Code Synthesis XSD。这将为您创建一个基于 XSD 的类层次结构。您只需填充一个对象层次结构,它就会为您创建 XML。
通过这种方式,您可以静态检查您的 XML 格式是否正确且有效,这确实有助于及早发现错误。
如果您曾经使用过 JAXB 或任何类似的 Java 工具,那几乎是一回事。
始终使用 DOM 来创建新的 XML...出于阅读目的,更喜欢 SAX..
您可以尝试在您的语言/平台中找到等效于 .NET 的XmlWriter 。