你们有什么建议?
如果你只是创建小的XML消息,我认为Xerces是过度杀伤力了。它是一个解析库,而你并没有解析任何东西。
您可以使用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");
<book title="Lord of the Rings">
<author age="43">Tolkien</author>
</book>
我建议创建DOM树。这样你就不必担心数据中的XML字符转义问题。如果一个开发人员忘记了一次,你可能会得到用户输入,导致XML输出不正确。
指标
比较手动创建字符串十几次所需时间与使用库的时间。
如果你的团队成员像我一样,他们很快就会改变想法。
此外,如果他们编写不正确,还要考虑QA时间等因素...
尽可能多地使用库。
我曾经遇到过同样的问题,想在嵌入式设备之间传递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>
我们尝试使用另一个库,但我不记得是哪一个,发现速度不够快。因为我们处理的消息很多,所以我们不想坚持手动格式化字符串。
如果你正在创建一个中等到大型的XML文件,你需要一个库来帮助你。如果你正在创建一个小到非常小的XML文件,你可以直接将文本流式传输到其中。
astream << "<book title=\"Lord of the Rings\"><author age=\"43\">Tolkien</author></book>"
如果你的XML文件大小与此片段相同,那么这种方式就是最简单的了。你可能会想以一些纯粹的理念来复杂化问题,但实际上这并没有帮助到你。
就像优化一样,你不应该在没有衡量影响的情况下随意更改代码。如果你的代码已经易于维护,请继续使用它。只有在你测量了它的可维护性(例如注意到更新XML文件很麻烦)并发现它花费的时间太长时,才应该尝试进行更改。
我实际上使用的是来自FirstObject.com的CMarkup。
CodeProject有一个较旧的分发版本和文本教程(http://www.codeproject.com/KB/cpp/markupclass.aspx)
源代码分发可通过FirstObject下载页面以多种版本(开发人员、高级开发人员)获得。
FirstObject网站包含许多有用的示例,甚至还提供免费的XML编辑器。
不,我不是雇员,但我是这个组件的满意用户。