Dom Vs Sax - 创造Xmls

时间:2010-02-25 07:27:28

标签: c++ xml dom sax

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

由于

9 个答案:

答案 0 :(得分:7)

SAX引用维基百科:

  

SAX (XML的简单API)是一个序列号   访问XML的解析器 API。
SAX   提供阅读的机制   来自XML文档的数据

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

答案 1 :(得分:4)

您可以使用SAX创建XML。见如下:

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

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

答案 2 :(得分:2)

  • 使用convienent API将数据放入内存时使用DOM。
  • 使用SAX,您可以编写大量数据,SAX还可以提供更高的性能。

你也可能被介入 What are the differences between SAX and DOM parser

DOM and SAX Put to the Test

答案 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 ..