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