当前位置:  开发笔记 > 编程语言 > 正文

在c ++中生成xml的最简单方法是什么?

如何解决《在c++中生成xml的最简单方法是什么?》经验,为你挑选了3个好方法。

我已经使用了boost序列化,但这似乎不允许我生成符合特定模式的xml - 似乎它的目的只是为了坚持一个类的状态.

平台:linux

你们用什么来生成NOT解析xml?

到目前为止,我正在寻找Foredecker自己生成它的路线 - 这不是一个大文件,但我真的不应该找到一个像样的库来正确生成它.

至于boost,我希望能够做的事情是设置节点名称,在我的节点中设置属性,并摆脱随附的所有额外垃圾,因为我真的不在乎必须放我的文件回到那个班级.



1> MattyT..:

我最近审查了一堆专门用于生成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生成,您可能会发现它非常有用.流语法非常整洁.

希望有些东西在那里使用!


嗯,看着最里面的元素,我怀疑输出和代码匹配.:-)

2> Foredecker..:

有些人可能会声称我是一个XML异端 - 但一种有效的方法是使用您喜欢的字符串输出工具(打印,输出流等)生成它 - 这可以转到缓冲区或文件.

一旦保存 - 你真的应该在提交之前用模式进行验证我们将其发送出去.

对于我们的一个项目,我们有一组非常简单的模板,用于管理开始/结束标记和属性.这些都有一个流输出操作符.这使得生成源XML和调试变得非常容易.这使得XML生成代码的结构看起来非常像XML本身.

这样做的一个优点是,如果流式传输到文件,您可以有效地生成大量的XML.您将在稍后支付验证费用(大概是在更昂贵的操作时间).

这种技术的缺点是它本质上只是输出.它不适合动态创建然后使用XML.


是的,异教徒!;)说真的,我建议不要走这条路 - 有很多库可以帮助你防止你在XML中犯错误.
我本能地同意这个答案,除了你*可能最终需要逃避一些事情." 和& 对于大多数用途来说可能已经足够了,但是如果你的数据足够多,你最终还是会编写一半的通用XML输出生成器......

3> Daniel Wolf..:

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应该给你它是如何工作的想法.

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有