用C ++代码创建XML

时间:2009-01-29 20:13:28

标签: c++ xml dom

在我的项目中,有些情况下我们必须在模块之间发送xml消息(作为char *)。它们不是很大的,只有10-15行。现在每个人都只是自己创建字符串。我不认为这是正确的方法。我们已经在使用xerces DOM库了。那么为什么不创建一个Dom树,序列化它,然后发送它。

你们有什么建议?

10 个答案:

答案 0 :(得分:6)

如果你真的只是在创建小型XML消息,那么Xerces就是一种矫枉过正,恕我直言。它是一个解析器库,你没有解析任何东西。

答案 1 :(得分:3)

您可以使用DOM或编写自己的小型C ++ XML生成框架。

Xerces API是从Java移植的,通过使用对象作用域,您可以更轻松地从C ++代码生成XML:

XmlWriter w;
Elem book = w.Element("book");
book.addAttrib("title", "Lord of the Rings");
Elem author = e.addChild("author");
author.addAttrib("age", 43);
author.addText("Tolkien");

这将产生以下XML:

<book title="Lord of the Rings">
  <author age="43">Tolkien</author>
</book>

答案 2 :(得分:3)

快速简便,试试TinyXml API:
http://www.grinninglizard.com/tinyxml/

答案 3 :(得分:2)

我建议创建DOM树。您不必担心在数据中转义XML字符。如果一个开发人员忘记了一次,您可能会有用户输入,导致您的XML输出不正确。

答案 4 :(得分:2)

手工创建XML是我所知道的疯狂的最可靠的方法之一。最终有人会把某个实体搞砸到某个地方,或者一个尾随的支架会被关掉,或者什么......只是使用一个库。 GenX将是我的选择。

修改:误读您的帖子。如果您已经有一个生成库,请使用它。如果可以避免,不要不必要地复杂化。

答案 5 :(得分:1)

<强>度量

比较您手动创建字符串十几次所需的时间,然后比较它与库的使用时间。

如果你的团队成员像我的一样,他们会很快改变他们的调子。

加上,如果他们编码错误就会影响QA时间,等等......

尽可能多地使用库。

答案 6 :(得分:1)

我想在嵌入式设备之间传递xml消息时遇到同样的问题。

我写了以下内容(所有在一个头文件中)作为解析和生成xml的快速api。它不支持所有xml功能,但大多数简单的xml消息无论如何都不需要它们:

http://www.scottlangham.co.uk/2009/01/rapidxml-a-quick-xml-parsergenerator-for-c/

评论中显示了示例用法。

要编写xml,您可以执行以下操作:

int isbn = 2938237;
wstring authorName = "Isaac Asimov";
wstring borrower = "Mr. Blobby";

CWTag bookTag = libraryTag(L"Book")
    (L"author",authorName) (L"isbn",isbn) (L"borrower",borrower);
bookTag(L"Review") (L"comments", L"very good");

这会导致在标记下添加新的xml:

<Book author="Isaac Asimov" isbn="2938237" borrower="Mr. Blobby">
    <Review comments="very good"/>
</Book>

我们确实尝试过另一个图书馆,我记不起哪个图书馆了,发现它不够快。我们不想坚持手动格式化字符串,因为我们处理了大量的消息。

答案 7 :(得分:0)

我只想使用DOM树。这样,您就不必在发送和接收xml字符串时来回解析数据。

---稍微偏离主题: 对于其他人而言,只需要删除这篇文章并偶然需要一个超轻量级的DOM xml框架,请使用以下文章:http://www.applied-mathematics.net/tools/xmlParser.html

它非常易于使用,由2个文件组成。

答案 8 :(得分:0)

如果您要创建中到大型XML文件,则需要一个库来帮助您。 如果您要创建一个小到非常小的XML文件,您也可以将文本流式传输到其中。

astream << "<book title=\"Lord of the Rings\"><author age=\"43\">Tolkien</author></book>"
对于那个大小的XML片段来说,

就像你可以获得的那样简单,如果你的XML文件是那么大的话,你也可以用这种方式构建它们 - 不要试图过分复杂的事情只是为了一些纯粹的理想而不是实际上对你有帮助。

与优化一样,你不应该在不衡量它的影响的情况下改变它。在这里,如果您的代码可以保持原样,请继续使用它。只有在你测量了它的可维护性时才会尝试改变它(即注意到它更难以更新XML),并发现它需要太长时间才能获得安慰。

答案 9 :(得分:0)

我实际上是使用 FirstObject.com 中的CMarkup。

CodeProject有一个较旧的发行版和文本教程(http://www.codeproject.com/KB/cpp/markupclass.aspx

源代码发行版可用,组件有多种版本(开发人员,高级开发人员)通过FirstObject下载页面。

FirstObject网站包含许多有用的示例,甚至还发布了免费的XML编辑器。

不,我不是员工,但我是该组件的满意所有者。