在我的项目中,有些情况下我们必须在模块之间发送xml消息(如char *)。它们不是很大,只有10-15行。现在每个人都自己创建字符串。我不认为这是正确的做法。我们已经在使用xerces DOM库。那么为什么不创建一个Dom树,将其序列化,然后发送它。在C++代码中创建XML
你们有什么建议?
在我的项目中,有些情况下我们必须在模块之间发送xml消息(如char *)。它们不是很大,只有10-15行。现在每个人都自己创建字符串。我不认为这是正确的做法。我们已经在使用xerces DOM库。那么为什么不创建一个Dom树,将其序列化,然后发送它。在C++代码中创建XML
你们有什么建议?
如果你真的只是创建小XML消息,Xerces是一个矫枉过正的,恕我直言。它是一个解析器库,你不解析任何东西。
指标
比较需要多长时间您手动创建的字符串十次左右,然后比较需要多长时间与库。
如果你的团队成员与我的一样,他们会很快改变他们的曲调。
加,因素QA时间,如果他们的代码错了,等...
尽可能多的,你可以使用这个库。
我建议创建DOM树。您不必担心在数据中转义XML字符。如果一个开发人员忘记一次,则可能会有用户输入,导致您的XML输出不正确。
我只是使用DOM树。这样,您不必在发送和接收xml字符串时来回解析数据。
---稍微偏离主题: 对于其他人只是通过这篇文章,偶然下降需要一个超轻量级的DOM XML框架使用这一个:http://www.applied-mathematics.net/tools/xmlParser.html
这是非常容易使用,它由2文件。
我有想要在嵌入式设备之间传递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>
我们曾尝试另一个库,我可以不记得哪一个,发现它不够快。我们不想坚持手动格式化字符串,因为我们处理的消息很多。
您可以使用DOM或编写自己的小型C++ XML生成框架。
API是从Java和使用对象范围内移植了Xerces您可以从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>
如果你正在创建一个大到中等的XML文件,你需要一个库来帮助你。 如果您正在创建一个小到非常小的XML文件,那么您最好只是将文本流式传输到它。
astream << "<book title=\"Lord of the Rings\"><author age=\"43\">Tolkien</author></book>"
大约是那么容易,因为你可以得到该尺寸XML片段,如果你的XML文件是大小,你可能也只是构建它们以这种方式 - 不要试图只是过分复杂化的问题对一些纯粹的理想,实际上并没有帮助你。
就像优化一样,如果不测量它会产生什么效果,就不应该改变它。在这里,如果你的代码是可以维护的,那么继续下去。只有在你测量了它的可维护性时才试图改变它(即注意到它更新XML的尴尬),并发现它为了获得舒适需要太长的时间。
处理xml元素中的'<' and '>'和'&'等字符 - 以及unicode。 – jdkoftinoff 2009-01-29 22:38:42
手动创建XML是我知道疯狂的最可靠方法之一。最终有人会在某个地方搞砸了一个实体,或者一个尾随的支架将会被关闭,或者什么......只是使用一个库。 GenX将是我的选择。
编辑:错误阅读信息。如果你已经有一个世代库,使用它。如果可以避免,不要使事情不必要地复杂化。
我实际上使用CMarkup从FirstObject.com。
CodeProject上有一个较旧的分配和文字教程(http://www.codeproject.com/KB/cpp/markupclass.aspx)
的源代码的发行版本和组件进来通过FirstObject下载页面(S)几种口味(开发人员,高级开发)。
FirstObject网站包含许多有用的示例,他们甚至分发免费的XML编辑器。
不,我不是一名员工,但我是该组件的满意所有者。
方便快捷,尝试TinyXml的API:
http://www.grinninglizard.com/tinyxml/
我坚决不同意。手动创建XML相当容易出错(编码问题,字符转义),所以我建议创建一个树(DOM或其他),然后序列化它。 – bortzmeyer 2009-01-30 09:52:02
嘿,我只是说“Xerces是一个矫枉过正”。只要程序员知道如何转义,就可以(也应该)通过单个函数或像Genx这样的轻量级库来处理:http://www.tbray.org/ongoing/genx/docs/Guide.html - Nemanja Trifunovic – 2009-01-30 13:49:59