出处:http://bbs.csdn.net/topics/390229172

已经自我放逐好几年了.打算去上班得了.在最后的自由日子里,做点有意义的事吧...

先来下载地址    http://www.kuaipan.cn/file/id_12470514853353274.htm

已经在很多正式,非正式的场合用过了.干脆开源得了.BSD授权.  代码比较久远,最后一次修改也在4~5年前了.写的比较BT,只有gcc/vc/icl能编译...不过性能和易用性还是不错的.之前我测试过的,只有几个in place的xml解析器稍微比我的快一点点.   下面是示例代码:

// xml-test.cpp
#include <stdio.h>
#include "xml.h"// 自定义FILE*输出策略
class cfile_writer {FILE *_fp;cfile_writer &operator = ( const cfile_writer& );cfile_writer( const cfile_writer& );
public:cfile_writer( FILE *fp ) : _fp(fp) {fputs( "-----------------\n", _fp );}~cfile_writer() {fputs( "\n", _fp );}// 策略不用预分配空间// 如果为1, 在输出前会计算要占空间大小, 并调用resize接口进行预分配.static const int need_pre_allocate = 0;// 预分配接口bool resize( size_t size ) const { return true; }// 输出一个字符void write( char value ) const  {fputc( value, _fp );}// 输出一个字符串, 长度由size指定void write( const char *value, size_t size ) const  {fwrite( value, 1, size, _fp );}
};int main() {using namespace cpp::utils;const char xml_string[] = "<root attr=\"root attr\"><node prop=\"234\"/>text content<!-- comment --></root>";xml x;// 解析xml_string, 用不同的reader策略可以从不同的源中读数据// 也可以自定义读策略, 以适应不同的需求// 解析成功返回true.如果只有部分解析成功时虽然返回false,但已经解析成功的内容仍然可用// 如果宏XML_WITH_PARSE_STATUS设置为1(默认为0).可以从x.info()中得到解析器停止的位置,方便调试.但会降低解析器性能.x.parse( xml_reader( xml_string ) );xml x2;x2.push_back( xml::tag("root-x2") );   // 直接向空xml对象中添加标签x2("root-x2").push_back( xml::text("text value") );x2.write( cfile_writer( stderr ) );// 输出/root/node[prop]的值// ()运算符为标签查找,返回指定名称的第一个标签.[]运算符为属性查找,返回指定名称的属性.printf( "/root/node[prop] = [%s]\n", x("root")("node")["prop"].value().c_str() );// 这里使用了null object模式,所以无需检查每一步的返回结果,不会因为访问非法节点而产生异常.简化使用printf( "null object test:[%s]\n", x("roxxot")("noeede")["prop"].value().c_str() );// 把root标签转成其迭代器(&运算符)xml::tag_iterator root_tag = &x("root");// 迭代所有子节点for( xml::node_iterator node = x.root()->begin(); node != x.root()->end(); ++node ) {// xml::node_iterator为通用节点迭代器, 可以指向任何类型的节点.// 并可以转型成任意的其它迭代器. 但如果指向的节点类型和目标迭代器类型不符, 则会自动指向下一个合法的节点// 比如: <abc/><!--comment-->//       这里有两个节点,一个abc标签,一个注释.//       如果有当前node迭代器指向abc标签.//            把node转成xml::tag_iterator类型时,则指向的节点不变.//         如果转成xml::comment_iterator时则会指向后面的注释.//          如果转成其它不存在类型的节点,则会指向容器的末尾.printf( "node type: %d\t", node->type );switch( node->type ) {case xml::_TYPE_TAG:printf( "tag name:%s\n", xml::tag_iterator(node)->name().c_str() );break;case xml::_TYPE_COMMENT:printf( "comment:%s\n", xml::comment_iterator(node)->text().c_str() );break;case xml::_TYPE_TEXT:printf( "text:%s\n", xml::text_iterator(node)->text().c_str() );break;case xml::_TYPE_ATTRIBUTE:printf( "attribute:%s=%s\n", xml::attribute_iterator(node)->name().c_str(), xml::attribute_iterator(node)->value().c_str() );break;default:printf( "unknown type\n" );break;}};// 迭代所有子标签for( xml::tag_iterator tag = x.root()->begin(); tag != x.root()->end(); ++tag ) {// 专用类型的迭代器只能遍历此类型的节点printf( "tag:%s\n", tag->name().c_str() );}// 在/root/node下添加abc标签, 并保存指向标签的迭代器xml::tag_iterator abc_tag = x("root")("node").push_back( xml::tag( "abc" ) );// 用abc_tag迭代器向abc标签添加属性abc_tag->push_back( xml::attribute( "tag-prop", "value abcdefg" ) );// 在abc标签前插入注释abc_tag->parent().insert( abc_tag, xml::comment( "tag-prop comment" ) );// 把xml_string解析出来,并将结果放到abc_tag所指向的标签里abc_tag->parse( xml_reader( xml_string ) );// 深拷贝x2对象中的根节点到abc标签中,实现跨xml对象进行节点复制abc_tag->push_front_copy( x2.root() );// 输出abc_tag指向的标签, 第二个参数true表示只输出内容标签的内容,不包含标签本身及属性abc_tag->write( cfile_writer( stdout ), true );// 删除第一个子节点abc_tag->erase( abc_tag->begin() );abc_tag->write( cfile_writer( stdout ), true );// 不能直接删除孙节点x.erase( xml::tag_iterator(abc_tag->begin()) );   // 转型成xml::tag_iterator是因为abc的第一个节点是属性.删除不直观.用标记会明显点abc_tag->write( cfile_writer( stdout ) );    // 没有删掉// 递归删除可以成功x.recursion_erase( xml::tag_iterator(abc_tag->begin()) );abc_tag->write( cfile_writer( stdout ) );  // 已经删除成功return 0;
}

只支持基本语法,很多东西不支持.比如:CDATA不支持,自定义转意也不支持...
用来做配置文件还是不错.

先弄个XML解析器代码抄一抄 慢慢研究 O(∩_∩)O哈哈~相关推荐

  1. Android XML解析器– XMLPullParser

    Welcome to android xml parser example using XMLPullParser. We will have a sample XML file that we wi ...

  2. Java XML解析器

    使用Apache Xerces解析XML文档 一.技术概述 在用Java解析XML时候,一般都使用现成XML解析器来完成,自己编码解析是一件很棘手的问题,对程序员要求很高,一般也没有专业厂商或者开源组 ...

  3. TinyXML:一个优秀的C++ XML解析器

    读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好. TinyXML是一个开源的解 ...

  4. Phinecos(洞庭散人) 专注于开源技术的研究与应用 TinyXML:一个优秀的C++ XML解析器

    读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好. TinyXML是一个开源的解 ...

  5. java xml解析器_Java XML解析器

    java xml解析器 Java XML parser is used to work with xml data. XML is widely used technology to transpor ...

  6. 精短高效的XML解析器,纯C单一程序,应用于银行的国税库行横向联网接口系统中,稳定可靠,运行速度飞快

    来源于:http://www.ej38.com/showinfo/c-xml-169407.html 供各位参考 精短高效的XML解析器,纯C单一程序,应用于银行的国税库行横向联网接口系统中,稳定可靠 ...

  7. C++11 boost::spirit::qi简单的XML解析器示例

    boost::spirit::qi是一个简单的解释器开发库.可以用来解析文本,构建解释器等. 笔者花了两天时间看完了README文档,并且照着Demo代码写了一遍.感觉语法很复杂.特别是最后的一个XM ...

  8. XML 解析器之一 :MSXML使用教程(转)

    介绍 微软的msxml是基于COM接口开发的,如同vbscript和javascript一样,微软这么做是为了提供更好的扩展性.你可以在用脚本来调用msxml,也可以用C++这样编程语言一样调用(虽然 ...

  9. 自己写的简单xml解析器

    已经自我放逐好几年了.打算去上班得了.在最后的自由日子里,做点有意义的事吧... 先来下载地址 http://www.kuaipan.cn/file/id_12470514853353274.htm ...

最新文章

  1. 深度学习准「研究僧」预习资料:图灵奖得主Yann LeCun《深度学习(Pytorch)》春季课程...
  2. 用tableView实现的一种加载数据的布局
  3. svn修改提交路径_使用SVN钩子强制提交日志和限制提交文件类型
  4. 关于可变字符串StringBuffer和String的区别总结
  5. 中国电信学院c语言题库,电脑题库试题精编版.doc
  6. python的json.dump参数使用
  7. 2015 - Deep recurrent q-learning for partially observable MDPs
  8. hdu 1004(排序+统计)
  9. keli调试变量出现负值
  10. Win10 Print Spooler 一直停止服务
  11. I2C总线的上拉电阻计算
  12. 3dmax测试软件自动关闭,3dmax软件会自动关闭解决方案
  13. access 分组序号,使用Access SQL进行分组排名
  14. 冯仑《企业领导最容易犯的十大错误》
  15. 13天Java进阶笔记-day11-网络编程和NIO
  16. windows10桌面_如何让Windows 10系统桌面变得更好看?
  17. Redis五大数据结构的类型的使用
  18. 零基础学Arcgis(四)|空间数据采集与管理(1)Shapefile和dBASE文件的创建与管理
  19. Sicily 题目分类
  20. ExoPlayer 2.18.2 基本使用(三)

热门文章

  1. C#让TopMost窗体弹出并置顶层但不获取当前输入焦点的终极办法
  2. MySQL关联left join 条件on与where不同
  3. PHP使用文件流下载文件方法(附:解决下载文件内容乱码问题)
  4. 动态添加后的数据转换 — 后台接收数据
  5. ES6学习笔记(二十二)ArrayBuffer
  6. centos6上安装mysql8.0版本
  7. web安全学习-验证机制存在的问题
  8. js 数组(Array)
  9. 计算机图形学方向投稿国外期刊
  10. mac环境下node.js和phonegap/cordova创建ios和android应用