2008-10-22 82 views
5

我有一个应用程序,使用MFC和Stingray库以C++编写。该应用程序适用于各种各样的大数据类型,它们都基于MFC Document/View序列化派生的功能进行了序列化。我还添加了基于Stingray库的XML序列化选项,Stingray库通过Microsoft XML SDK实现DOM。虽然易于实现,但性能非常糟糕,只能在非常小的文档以外的任何地方使用。MFC C++应用程序的最佳XML序列化库

你会推荐什么样的其他XML序列化工具用于这个场景。我不想要DOM,因为它似乎是一个记忆猪,我已经在处理大量的内存数据。理想情况下,我想要一个流式解析器,它的速度很快,并且易于与MFC一起使用。我目前的领跑者是expat这是快速和简单的,但需要添加很多类的序列化代码。任何其他有效和更容易实施的人们会推荐的替代方案?

回答

4

Boost Serialization库支持XML。这个库基本包括:

  1. 从MFC序列化的原则开始,并采取它提供的所有好东西。
  2. 解决MFC序列化的每一个问题!

与MFC相比有一些改进是对XML的支持。 请注意,您不一定要控制此序列化的XML模式。它使用自己的模式。

+0

boost序列化看起来非常合适,并且很可能是远离MFC的第一步。 – 2008-10-22 14:19:08

2

一个好的解决方案是libxml。它为XML处理提供轻量级的SAX解析和数据结构。有几个DOM库建立在libxml之上。

不幸的是它是一个C库,但C++包装可用。

几年前,由于您提到的性能问题,我从MSXML切换到libxml。

如果您决定使用libxml,您还应该看看libxslt

+0

LibXML一路!别忘了它的姐妹组件LibXSLT。 – spoulson 2008-10-22 11:50:15

+0

好点,我在我的回答中提到过。 – 2008-10-22 11:57:19

0

我们使用TinyXML来满足我们所有的XML需求,无论是MFC还是直通C++。

http://sourceforge.net/projects/tinyxml

+0

似乎使用的DOM风格的方法可能不适合这个特定的应用程序。无论如何感谢链接。 – 2008-10-23 10:20:06

1

RapidXML,我使用它在MFC应用程序进行一些修改,以支持UTF-16的std :: string。到目前为止,我对此非常满意。

4

这是一个古老的问题。 1999年和2000年,我担任开发团队的团队负责人,对全球最大的软件项目提供了最重要的路径依赖关系,这是我在此期间工作的重点。我相信,这个轮子是由多位工程师发明的,他们不知道其他人已经发明了它。 C++中的XML数据绑定也是如此。我也发明了它,并且在各种项目上我已经完善了10多年。我有一个解决方案来解决这里提到的问题以及一些重复出现的问题:

  1. XML更新。这是将XML的子集重新应用于现有对象模型的能力。在许多情况下,XML绑定到索引对象,我们不能为每次更新重新编制索引。

  2. COM和CORBA接口管理。同样,XML数据绑定可以通过面向对象的实践自动化 - 接口对象的实例也可以将这些数据提供给应用程序层。

  3. 状态跟踪。应用程序通常需要区分空值和缺失值 - 都创建一个空字符串。这提供了验证以及数据绑定。

源代码使用最少限制性许可证 - 因此GPL。该项目支持和管理,从这里:

http://www.codeproject.com/KB/XML/XMLFoundation.aspx

现在,它的2010年,我相信没有人会试图重新发明轮子,因为有几个选择。恕我直言 - 这个轮子是最完善和全面的实施可用。

享受。

1

的gSOAP的工具包自动序列化天然C和C++数据到/从XML和支持通过XML数据绑定完整的XML架构规范:

gSOAP SourceForge Project

自1999年以来它已演变到显著代码库使用代码生成工具和库。它支持许多数据绑定和自定义功能,这对于将XML模式类型映射到C和C++类型或从中映射尤其重要。它可以序列化任何C/C++类型以及STL容器,容器模板和循环数据结构。它已被用于W3C Schema Patterns for Databinding工作组(自数年以来100%的模式模式覆盖率成功)。有一个积极的开源用户群,gSOAP开发功能已被许多工业项目和财富100强公司用于开发SOAP/XML基础架构。

1

这是游戏后期,我只想提一提,我们也使用LIBXML。它坚固可靠,并且运作良好。有点太低级,你会想在它的函数之上构建一些包装。

<tag attribute="value"/> 

或本:

举例来说,你会取决于你是否有这样的功能得到回报的不同序列

<tag attribute="value"> </tag> 

有时你可能想的是,有时你不不在乎。