zoukankan      html  css  js  c++  java
  • 你不再需要TinyXML,推荐RapidXML

    TinyXML有两个不爽的地方,一是它的接口使用FILE*,另外一个是它对 wchar_t不能很好的支持。前阵子看Boost库的更新中多了一个PropertyTree,他在处理XML时用到了另外一个小的库 –RapidXML。既然间接的是Boost库的一部分,所以是值得一试的。于是找到其官方网站(http://rapidxml.sourceforge.net/)研究了一番。一看之下,甚是满意,也推荐给大家看看!

    首先就是速度,据它自己宣称比TinyXML快30到60倍,比Xerces DOM快50到100倍!详细的测试比较请见其用户手册(http://rapidxml.sourceforge.net/manual.html)的“4. Performance ”一节。

    其次它的设计非常的简洁,只依赖于标准库中的几个基本的类。它的输入输出都是字符串,这样很好,一个库就应该关注自己核心的内容,做尽量少的事情。它的API其实和TinyXML倒是有几分相似,用过TinyXML的人应该很容易上手:

    TinyXML主要接口类     RapidXML的主要接口类

    TinyXML主要接口类
    RapidXML的主要接口类

    class TiXmlDocument
    template<class Ch = char>
    class xml_document

    class TiXmlNode
    template<class Ch = char>
    class xml_node

    class TiXmlAttribute
    template<class Ch = char>
    class xml_attribute

    下面还是看一个具体的例子来体验一下,下面是TinyXML官方教程中创建XML文档的一段代码:

    void build_simple_doc( )
    {
    // Make xml: <?xml ..><Hello>World</Hello>
    TiXmlDocument doc;
    TiXmlDeclaration * decl = new TiXmlDeclaration( “1.0″, “”, “” );
    TiXmlElement * element = new TiXmlElement( “Hello” );
    TiXmlText * text = new TiXmlText( “World” );
    element->LinkEndChild( text );
    doc.LinkEndChild( decl );
    doc.LinkEndChild( element );
    doc.SaveFile( “madeByHand.xml” );
    }

    下面是使用RapidXML实现类似功能的代码:

    void build_simple_doc_by_rapidxml()
    {
    xml_document<> doc;
    xml_node<>* decl = doc.allocate_node(node_declaration);
    xml_attribute<>* decl_ver =
    doc.allocate_attribute(“version”, “1.0″);
    decl->append_attribute(decl_ver);
    doc.append_node(decl);

    xml_node<>* node =
    doc.allocate_node(node_element,    “Hello”, “World”);
    doc.append_node(node);

    string text;
    rapidxml::print(std::back_inserter(text), doc, 0);

    // write text to file by yourself
    }

    下面是使用RapidXML分析XML的样例代码:

    void parse_doc_by_rapidxml(char* xml_doc)
    {
    xml_document<> doc;        // character type defaults to char
    doc.parse<0>(xml_doc);  // 0 means default parse flags

    xml_node<> *node = doc.first_node(“Hello”);
    string node_val = node->value();
    }

    好东西,大家分享!:D

  • 相关阅读:
    Delphi-基础(for循环)
    Delphi-基础(运算符)
    Delphi-基础
    python 序列化
    python 模块、包
    time,datetime,random,os,sys,hashlib,logging,configparser,re模块
    第一章.Python环境安装&Pycharm日常使用
    第一章.变量.常量.注释.运算符.if流程控制
    Redis持久化数据介绍&主从复制和哨兵模式环境部署
    Redis缓存应用安装部署&常见的数据类型
  • 原文地址:https://www.cnblogs.com/flying_bat/p/1703263.html
Copyright © 2011-2022 走看看