使用Boost来读取和写入XML文件
有什么好的方法(也是一个简单的方法)使用Boost来读取和写入XML文件?
我似乎无法find任何简单的示例使用Boost来读取XML文件。 你能指点我一个简单的示例,使用Boost读取和写入XML文件?
如果不是Boost,有什么好的和简单的库来读取和写入XML文件,你可以推荐? (它必须是一个C ++库)
你应该尝试pugixml C ++的轻量级,简单和快速的XMLparsing器
关于pugixml最好的事情是TinyXML和RapidXML缺乏的XPath支持。
引用RapidXML的作者“我要感谢Arseny Kapoulkine在pugixml上的工作,这是对这个项目的灵感”,“比我知道的最快的XMLparsing器pugixml快5%-30%”他已经testing了0.3版本pugixml,最近已经达到了0.42版本。
以下是pugixml文档的摘录:
主要特点是:
- 低内存消耗和碎片(胜过pugxml是〜1.3倍,TinyXML – 〜2.5倍,Xerces(DOM) – 〜4.3倍)。 在与现有parsing器部分比较中可以看到确切的数字。
- 极高的parsing速度(胜过pugxml是〜6倍,TinyXML – 〜10倍,Xerces-DOM〜〜17.6倍1
- 非常高的parsing速度(好吧,我重复自己,但速度非常快,在testingXML上它比Expat高出2.8倍)2
- 或多或less符合标准(它将正确parsing符合标准的文件,除DTD相关的问题外)
- 相当多的错误无知(它不会像你和我这样的东西窒息,就像expat意志;它会parsing错误编码的数据的文件;等等)
- 清洁的界面(一个重构的pugxml的)
- 或多或less具有Unicode意识(实际上,它假设input数据是UTF-8编码,但是它可以很容易地与ANSI一起工作 – 现在没有UTF-16(参见“将来的工作”),带有辅助转换function(UTF- > UTF-16/32(无论是std :: wstring和wchar_t的默认值))
- 完全符合标准的C ++代码(由Comeau严格模式批准); 该图书馆是多平台(请参阅平台列表参考)
- 高度灵活。 您可以通过parsing选项来控制文件parsing和DOM树构build的许多方面。
好的,你可能会问 – 这是什么情况? 一切都非常可爱 – 这是一个小型,快速,健壮,干净的parsingXML解决scheme。 什么不见了? 好吧,我们是公平的开发者 – 所以这是一个错误的名单:
- 内存消耗。 它击败了我所知道的每个基于DOM的parsing器 – 但是当SAXparsing器到来时,就没有机会了。 您无法处理less于4 Gb内存的2 Gb XML文件 – 并快速执行。 虽然pugixml的performance比所有其他基于DOM的parsing器都好,所以如果你坚持使用DOM,这不是问题。
- 内存消耗。 好吧,我正在重复自己。 再次。 当其他parsing器将允许您提供XML文件在一个不断的存储(甚至作为一个内存映射区),pugixml不会。 所以你必须将整个数据复制到一个非常量存储中。 而且,它应该在parsing器的生命周期中坚持下去(下面写着关于生命周期的更多原因)。 再说一次,如果你对DOM确定 – 这应该不成问题,因为整体内存消耗较less(尽pipe你需要连续的内存块,这可能是一个问题)。
- 缺lessvalidation,DTD处理,XML命名空间,正确的编码处理。 如果你需要这些 – 去MSXML或XercesC或类似的东西。
TinyXML可能是一个不错的select。 至于Boost:
Boost Repository中有Property_Tree库。 它已被接受,但目前似乎缺乏支持(EDIT: Property_Tree现在是1.41版本以来的Boost的一部分,请阅读有关其XMLfunction的文档 )。
Daniel Nuffer为Boost Spirit实现了一个xmlparsing器 。
还有TinyXML ,它是一个不错的小型C ++库。 如果您正在寻找一个较低级别的库, RapidXML是一个很好的起点。
Boost使用RapidXML ,如章节XML分析器页面中所述如何填充特性树 :
不幸的是,截至本文撰写时, Boost中没有XMLparsing器。 因此,该库包含快速和小巧的RapidXMLparsing器(当前版本为1.13),以提供XMLparsing支持。 RapidXML不完全支持XML标准; 它不能parsingDTD,因此不能进行完整的实体replace。
请参阅XML提升教程 。
由于OP需要一个“简单的方法来使用boost来读取和写入XML文件” ,我在下面提供了一个非常基本的例子:
<main> <owner>Matt</owner> <cats> <cat>Scarface Max</cat> <cat>Moose</cat> <cat>Snowball</cat> <cat>Powerball</cat> <cat>Miss Pudge</cat> <cat>Needlenose</cat> <cat>Sweety Pie</cat> <cat>Peacey</cat> <cat>Funnyface</cat> </cats> </main>
(猫的名字来自Matt Mahoney的主页 )
C ++中的相应结构:
struct Catowner { std::string owner; std::set<std::string> cats; };
read_xml()
用法:
#include <boost/property_tree/ptree.hpp> #include <boost/property_tree/xml_parser.hpp> Catowner load(const std::string &file) { boost::property_tree::ptree pt; read_xml(file, pt); Catowner co; co.owner = pt.get<std::string>("main.owner"); BOOST_FOREACH( boost::property_tree::ptree::value_type &v, pt.get_child("main.cats")) co.cats.insert(v.second.data()); return co; }
write_xml()
用法:
void save(const Catowner &co, const std::string &file) { boost::property_tree::ptree pt; pt.put("main.owner", co.owner); BOOST_FOREACH( const std::string &name, co.cats) pt.add("main.cats.cat", name); write_xml(file, pt); }
那么有没有特定的图书馆在提升XMLparsing,但有很多的select,这里有一对夫妇: libxml , Xerces , Expat
当然你也可以使用其他一些库来帮助你build立自己的图书馆,但这可能是一个相当大的任务。
这是IBM关于这个主题的一篇文章 。
Boost不提供XMLparsing器atm。
Poco XML( Poco C ++库的一部分 )非常简单。
看起来,boost序列化可以读取和写入到XML档案,如果这足够你的目的。
使用Boost更简单的XML
确定地使用TinyXML *竖起大拇指*
看看阿拉比卡
如果您只是在寻找DOMfunction,那么在这个线程中已经有一些build议了。 我个人可能不会打扰缺乏XPath支持的库,而在C ++中,会使用Qt。 还有TinyXPath,Arabica声称拥有XPath支持,但是我不能说这些。
从我潜伏在Boost邮件列表中的经验来看,似乎每次XML出现的时候,它都被转移到了关于Unicode的讨论中。 但是,由于现在有一个潜在的Unicode库可能出现,所以我认为XML库不会在那里出现太久。
同时,我也一直在使用TinyXML。
有关RapidXML的有趣链接。 我会看看这个。
一个警告。 我喜欢RapidXML,但是在parsingUTF16时有一个非常讨厌的bug。 一些有效的值导致它崩溃。
我很乐意推荐pugixml – 但它缺乏名称空间支持,我知道这会给我带来麻烦。
有一个GSoC提出了改进Boost.XML的现有build议的工作: https : //github.com/stefanseefeld/boost.xml,但是Andrzej提出了Boost.PropertyTree对于这个任务是很好的。 自然取决于xml大小和需要的validation支持。
最近在Boost邮件列表上提出了一个图书馆: http : //www.codesynthesis.com/projects/libstudxml/doc/intro.xhtml
boost.spirit呢?
在这里 ,他们展示了一个“ 迷你XML ”parsing器