2009-01-29 74 views
9

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

你们有什么建议?

回答

6

如果你真的只是创建小XML消息,Xerces是一个矫枉过正的,恕我直言。它是一个解析器库,你不解析任何东西。

+2

我坚决不同意。手动创建XML相当容易出错(编码问题,字符转义),所以我建议创建一个树(DOM或其​​他),然后序列化它。 – bortzmeyer 2009-01-30 09:52:02

+1

嘿,我只是说“Xerces是一个矫枉过正”。只要程序员知道如何转义,就可以(也应该)通过单个函数或像Genx这样的轻量级库来处理:http://www.tbray.org/ongoing/genx/docs/Guide.html - Nemanja Trifunovic – 2009-01-30 13:49:59

1

指标

比较需要多长时间您手动创建的字符串十次左右,然后比较需要多长时间与库。

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

加,因素QA时间,如果他们的代码错了,等...

尽可能多的,你可以使用这个库。

2

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

0

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

---稍微偏离主题: 对于其他人只是通过这篇文章,偶然下降需要一个超轻量级的DOM XML框架使用这一个:http://www.applied-mathematics.net/tools/xmlParser.html

这是非常容易使用,它由2文件。

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> 

我们曾尝试另一个库,我可以不记得哪一个,发现它不够快。我们不想坚持手动格式化字符串,因为我们处理的消息很多。

3

您可以使用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> 
0

如果你正在创建一个大到中等的XML文件,你需要一个库来帮助你。 如果您正在创建一个小到非常小的XML文件,那么您最好只是将文本流式传输到它。

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

大约是那么容易,因为你可以得到该尺寸XML片段,如果你的XML文件是大小,你可能也只是构建它们以这种方式 - 不要试图只是过分复杂化的问题对一些纯粹的理想,实际上并没有帮助你。

就像优化一样,如果不测量它会产生什么效果,就不应该改变它。在这里,如果你的代码是可以维护的,那么继续下去。只有在你测量了它的可维护性时才试图改变它(即注意到它更新XML的尴尬),并发现它为了获得舒适需要太长的时间。

+0

处理xml元素中的'<' and '>'和'&'等字符 - 以及unicode。 – jdkoftinoff 2009-01-29 22:38:42

2

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

编辑:错误阅读信息。如果你已经有一个世代库,使用它。如果可以避免,不要使事情不必要地复杂化。

0

我实际上使用CMarkup从FirstObject.com

CodeProject上有一个较旧的分配和文字教程(http://www.codeproject.com/KB/cpp/markupclass.aspx

的源代码的发行版本和组件进来通过FirstObject下载页面(S)几种口味(开发人员,高级开发)。

FirstObject网站包含许多有用的示例,他们甚至分发免费的XML编辑器。

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