6

我知道 Sax 和 Dom 之间在解析 Xml 方面的区别相当大,但是创建一个呢?有没有办法使用 Sax 创建新的 Xml,或者如果我想根据程序中的数据创建新的 Xml 文件,我将不得不使用 DOM?

谢谢

4

9 回答 9

7

SAX 是,引用维基百科:

SAX (Simple API for XML)是一个用于 XML 的串行访问解析器API。
SAX 提供了一种从 XML 文档中读取数据的机制。

即 SAX 非常适合读取 XML 文档,但如果您想编写一个,您可能会使用 DOM。

于 2010-02-25T07:37:46.733 回答
4

您可以使用 SAX 创建 XML。请参阅以下内容:

http://code.google.com/p/jlibs/wiki/XMLDocument

它是在 Java 中的。但同样可以用 C++ 来实现;

于 2010-02-25T08:14:53.430 回答
2
  • 当您的数据通过方便的 API 适合内存时,将使用 DOM。
  • 使用 SAX,您可以写入大量数据,SAX 还提供更高的性能。

您也可能对 SAX 和 DOM 解析器有什么区别感兴趣

DOM和SAX 经受考验

于 2010-02-25T07:39:56.570 回答
2

SAX 用于读取 XML 文档,而不是编写它们。

另一方面,DOM 旨在创建内存结构和 XML 文档之间的映射。

如果您已经在内存中拥有自己的数据结构(这比 DOM 结构更方便您的处理),那么创建 DOM 数据结构将意味着复制您的数据。如果您有大量数据,也许这不是您想要的。此外,您必须先完全创建 DOM 结构,然后才能将其写入 XML,从而使应用程序所需的内存大小增加一倍。此外,它会在您的处理过程中产生延迟。

我不知道有什么库可以帮助编写 XML 文档,但如果我已经在使用 SAX,拥有自己的数据结构,我就不会为 DOM 烦恼。

于 2010-02-25T08:10:52.747 回答
1

DOM 是创建文档的自然选择。

于 2010-02-25T07:31:46.680 回答
1

我还没有见过 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")
      )
    )
  ;
}
于 2010-02-25T07:43:03.167 回答
1

有时我只会使用 printf 来制作简单的 XML,但通常值得使用 XML 绑定工具,例如Code Synthesis XSD。这将为您创建一个基于 XSD 的类层次结构。您只需填充一个对象层次结构,它就会为您创建 XML。

通过这种方式,您可以静态检查您的 XML 格式是否正确且有效,这确实有助于及早发现错误。

如果您曾经使用过 JAXB 或任何类似的 Java 工具,那几乎是一回事。

于 2010-02-25T12:01:15.460 回答
0

始终使用 DOM 来创建新的 XML...出于阅读目的,更喜欢 SAX..

于 2013-03-09T18:32:35.653 回答
0

您可以尝试在您的语言/平台中找到等效于 .NET 的XmlWriter 。

于 2010-07-02T22:55:48.100 回答