我已经使用了boost序列化,但这似乎不允许我生成符合特定模式的xml - 似乎它的目的只是为了坚持一个类的状态.
平台:linux
你们用什么来生成NOT解析xml?
到目前为止,我正在寻找Foredecker自己生成它的路线 - 这不是一个大文件,但我真的不应该找到一个像样的库来正确生成它.
至于boost,我希望能够做的事情是设置节点名称,在我的节点中设置属性,并摆脱随附的所有额外垃圾,因为我真的不在乎必须放我的文件回到那个班级.
我最近审查了一堆专门用于生成XML代码的XML库.
执行摘要:我选择使用TinyXML ++.
TinyXML ++具有不错的C++语法,建立在成熟的TinyXML C库之上,是免费的开源(MIT许可证)而且很小.简而言之,它有助于快速完成工作.这是一个快速片段:
Document doc; Node* root(doc.InsertEndChild(Element("RootNode"))); Element measurements("measurements"); Element tbr("TotalBytesReceived", 12); measurements.InsertEndChild(tbr); root->InsertEndChild(measurements);
哪个产生:
12
我一直很满意.
我回顾了很多其他人; 这里有一些更好的竞争者:
Xerces:国王爸爸.做所有事情(特别是与Xalan结合使用时),但重量级并强制用户进行内存管理.
RapidXML:非常适合解析(它是一种原位解析器并且速度很快)但不适合生成,因为向DOM添加节点需要内存管理.
Boost.XML(提案):看起来很棒 - 功能强大,出色的C++语法.但是,它尚未完成审核过程,不受支持且界面可能会发生变化.无论如何几乎都用过它.期待它被Boost接受.
Libxml(++):非常好; 强大,体面的语法.但是,如果您所做的只是生成 XML并且与glibmm库绑定(对于ustring),那就太大了.如果我们只在Linux上(就像你自己一样?)我会认真考虑.
XiMOL:独特的基于流的库.这对我们的需求来说有点过于简单,但对于基本的XML生成,您可能会发现它非常有用.流语法非常整洁.
希望有些东西在那里使用!
有些人可能会声称我是一个XML异端 - 但一种有效的方法是使用您喜欢的字符串输出工具(打印,输出流等)生成它 - 这可以转到缓冲区或文件.
一旦保存 - 你真的应该在提交之前用模式进行验证我们将其发送出去.
对于我们的一个项目,我们有一组非常简单的模板,用于管理开始/结束标记和属性.这些都有一个流输出操作符.这使得生成源XML和调试变得非常容易.这使得XML生成代码的结构看起来非常像XML本身.
这样做的一个优点是,如果流式传输到文件,您可以有效地生成大量的XML.您将在稍后支付验证费用(大概是在更昂贵的操作时间).
这种技术的缺点是它本质上只是输出.它不适合动态创建然后使用XML.
Boost.PropertyTree是一种生成XML的简单直接的方法 - 特别是如果你已经在使用Boost.
以下是一个完整的示例程序:
#include#include using boost::property_tree::ptree; using boost::property_tree::write_xml; using boost::property_tree::xml_writer_settings; int wmain(int argc, wchar_t* argv[]) { char* titles[] = {"And Then There Were None", "Android Games", "The Lord of the Rings"}; ptree tree; tree.add("library. .version", "1.0"); for (int i = 0; i < 3; i++) { ptree& book = tree.add("library.books.book", ""); book.add("title", titles[i]); book.add(" .id", i); book.add("pageCount", (i+1) * 234); } // Note that starting with Boost 1.56, the template argument must be std::string // instead of char write_xml("C:\\Users\\Daniel\\Desktop\\test.xml", tree, std::locale(), xml_writer_settings (' ', 4)); return 0; }
生成的XML如下所示:
And Then There Were None 234 Android Games 468 The Lord of the Rings 702
有一点特别好的是点分隔路径,允许您隐藏地创建沿途的所有节点.该文档是相当微薄,但用起来ptree.hpp
应该给你它是如何工作的想法.