用C++代码创建XML

9
在我的项目中,有些情况下我们需要在模块之间发送XML消息(作为char*)。它们并不是非常大,只有10-15行。目前每个人都自己创建字符串。我认为这不是正确的方法。我们已经在使用Xerces DOM库了。那么为什么不创建一个DOM树,对其进行序列化,然后再发送呢?
你们有什么建议?
10个回答

6

如果你只是创建小的XML消息,我认为Xerces是过度杀伤力了。它是一个解析库,而你并没有解析任何东西。


2
我强烈不同意。手动创建XML非常容易出错(编码问题,字符转义),因此我建议创建一个树形结构(DOM或其他)然后进行序列化。 - bortzmeyer
1
嘿,我刚才说“Xerces是过度杀伤力”。转义可以(而且应该)由单个函数或轻量级库(如Genx:http://www.tbray.org/ongoing/genx/docs/Guide.html)处理- Nemanja Trifunovic - Nemanja Trifunovic

3

为了证实其质量,请查看Adobe SDK中的存在者。请查看\sdk91_v1_win\Adobe\Acrobat 9 SDK\Version 1\NonAdobeSupport\TinyXML (http://download.macromedia.com/pub/developer/acrobat/sdk/9/sdk91_v1_win.zip)。 - lsalamon

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

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


2
手动创建XML是我知道的最容易出错的方法之一。最终,某个地方会出现错误实体,或者漏掉一个括号,或者其他问题......所以只需使用库。GenX将是我的选择。GenX
编辑:误读了您的帖子。如果您已经有生成库,请使用该库。如果可以避免不必要的复杂性,则不要使事情变得复杂。

1

指标

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

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

此外,如果他们编写不正确,还要考虑QA时间等因素...

尽可能多地使用库。


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>

我们尝试使用另一个库,但我不记得是哪一个,发现速度不够快。因为我们处理的消息很多,所以我们不想坚持手动格式化字符串。


0
我会使用DOM树。这样,当发送和接收XML字符串时,您无需来回解析数据。
--- 稍微离题: 对于其他路过这篇文章的人并且偶然需要一个超轻量级的DOM xml框架,请使用此链接:http://www.applied-mathematics.net/tools/xmlParser.html
它非常容易使用,并且只由两个文件组成。

0

如果你正在创建一个中等到大型的XML文件,你需要一个库来帮助你。如果你正在创建一个小到非常小的XML文件,你可以直接将文本流式传输到其中。

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

如果你的XML文件大小与此片段相同,那么这种方式就是最简单的了。你可能会想以一些纯粹的理念来复杂化问题,但实际上这并没有帮助到你。

就像优化一样,你不应该在没有衡量影响的情况下随意更改代码。如果你的代码已经易于维护,请继续使用它。只有在你测量了它的可维护性(例如注意到更新XML文件很麻烦)并发现它花费的时间太长时,才应该尝试进行更改。


只要程序员知道如何处理XML元素中的字符'<','>'和'&',以及Unicode,就可以了。 - jdkoftinoff

0

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

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

源代码分发可通过FirstObject下载页面以多种版本(开发人员、高级开发人员)获得。

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

不,我不是雇员,但我是这个组件的满意用户。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接