C++ Dom与Sax——创建XML

C++ Dom与Sax——创建XML,c++,xml,dom,sax,C++,Xml,Dom,Sax,我知道Sax和Dom在解析Xml方面有很大的区别,但是如何创建Xml呢?是否有一种方法可以使用Sax创建新的Xml,或者如果我想基于程序中的数据创建新的Xml文件,就必须使用DOM 谢谢,DOM是创建文档的自然选择。SAX是,引用维基百科: SAX(XML的简单API)是一个串行接口 访问XML解析器

我知道Sax和Dom在解析Xml方面有很大的区别,但是如何创建Xml呢?是否有一种方法可以使用Sax创建新的Xml,或者如果我想基于程序中的数据创建新的Xml文件,就必须使用DOM


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

SAX是,引用维基百科:

SAX(XML的简单API)是一个串行接口 访问XML解析器<萨克斯 提供读取的机制 来自XML文档的数据

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

  • 当数据通过方便的API放入内存时,使用DOM
  • 使用SAX,您可以编写大量数据,SAX还提供了更高的性能
你也可能对这件事感兴趣


而且

我还没有见过SAX风格的编写API,它只用于阅读。用于编写选项的是DOM和各种非标准化的构建器API(它们通常比DOM方便得多)。不同语言/库的非标准化API有所不同,但请参见示例。我还为操作员重载C++类似的API:(例子是测试一个可能的API,它实际上什么都不做)

#包括
结构XMLBuilder{
XMLBuilder和运算符[](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()
[“联系人”](XMLBuilder()
[“姓名”](“帕特里克·海因斯”)
[“电话”(“类型”、“家庭”)(“206-555-0144”)
[“电话”](“类型”、“工作”)(“425-555-0145”)
[“地址”](XMLBuilder()
[“街道”](“街道”)
[“zip”](“12345”)
)
)
;
}

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

另一方面,DOM用于创建内存中的结构和XML文档之间的映射

如果内存中的数据已经有了自己的数据结构(这比处理DOM结构方便得多),那么创建DOM数据结构将意味着复制数据。如果你有大量的数据,也许这不是你想要的。此外,在将DOM结构写入XML之前,必须完全创建DOM结构,从而将应用程序所需的内存大小增加一倍。此外,它还会在处理过程中造成延迟


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

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


它是用Java编写的。但同样可以用C++实现; 有时我只会使用printf来生成简单的XML,但通常使用XML绑定工具是值得的,例如。这将基于XSD为您创建一个类层次结构。您只需填充一个对象层次结构,它就会为您创建XML

通过这种方式,您可以进行静态检查,确保XML格式正确且有效,这确实有助于尽早发现错误


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

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

始终使用DOM来创建新的XML…出于阅读目的,首选SAX。

创建XML的最简单方法是进行字节/字符串级别的合并。。为什么人们希望使用解析API来创建文档?在进行字符串连接时,您必须自己处理转义(例如,包括许多人忘记的CDATA);这已经是使用API的一个很好的理由;;此外,DOM(相当)标准化了accros语言,这是一件好事,它将帮助您更容易理解代码;;我已经看到了太多用于创建XML的蹩脚的“连接”类型代码……您需要登录,才能读取“DOM和SAX测试”链接,这太糟糕了。。
#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")
      )
    )
  ;
}