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



出处: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不支持,自定义转意也不支持...
用来做配置文件还是不错.


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254704.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

紫书 例题8-10 UVa 714 (二分答案)

这道题让最大值最小&#xff0c; 显然是二分答案当题目求的是最大值最小&#xff0c; 最小值最大&#xff0c; 这个时候就要想到二分答案为什么可以二分答案呢&#xff0c; 因为这个时候解是单调性的&#xff0c; 如果简单粗暴一点就全部枚举一遍&#xff0c; 验证答案。但是因…

was not declared in this scope

“was not declared in this scope”是一个错误信息&#xff0c;在编译的时候会遇到。其含义为标识符在其出现的地方是未被定义的。 出现该错误的时候&#xff0c;会同时把未定义的变量名显示出来。比如如下程序&#xff1a; int main(){ printf("%d",i);//这个i是…

函数参数的传递问题(一级指针和二级指针)

函数参数的传递问题&#xff08;一级指针和二级指针&#xff09; [转]原以为自己对指针掌握了&#xff0c;却还是对这个问题不太明白。请教&#xff01; 程序1&#xff1a; void myMalloc(char *s) //我想在函数中分配内存,再返回 { s(char *) malloc(100); } void …

Win7下使用U盘安装linux Ubuntu16.04双系统图文教程

Win7下使用U盘安装linux Ubuntu16.04双系统图文教程 Ubuntu&#xff08;友帮拓、优般图、乌班图&#xff09;是一个以桌面应用为主的开源GNU/Linux操作系统&#xff0c;Ubuntu 是基于DebianGNU/Linux&#xff0c;支持x86、amd64&#xff08;即x64&#xff09;和ppc架构&#xf…

SynchronizationContext

SendOrPostCallback xxx vg > { Text "内部&#xff1a; "vg.ToString(); };dynamic vx new { a SynchronizationContext.Current, b xxx };Thread td new Thread(x >{dynamic tmp x;// SynchronizationContext ds x as SynchronizationContext;for (in…

CoDeSys的前世今生

&#xfeff;&#xfeff;工作以及网上看到不少人说&#xff0c;CoDeSys和西门子step7&#xff0c;在德国都属于标准过程&#xff0c;牛逼的小朋友都可以用其编程&#xff0c;不知真假&#xff0c;相信无风不起浪&#xff0c;多少有些依据&#xff0c;看看国內清一色的日系编程…

UVALive 7324 ASCII Addition (模拟)

ASCII Addition题目链接&#xff1a; http://acm.hust.edu.cn/vjudge/contest/127407#problem/A Description Nowadays, there are smartphone applications that instantly translate text and even solve math problems if you just point your phone’s camera at them. You…

Eclipse中执行Ant脚本出现Could not find the main class的问题及解

试过了&#xff1a;https://blog.csdn.net/bookroader/article/details/2300337 但是不管用&#xff0c;偶然看到这篇没有直接关系的 https://blog.csdn.net/jiuyueguang/article/details/9350753 联想了一下。项目是JDK1.5&#xff0c;Eclipse是JDK1.8启动&#xff0c;所以在R…

获得变量的名称获得传入参数的参数类型与堆栈中的函数名获得变量的名称

获得变量的名称 获得变量的名称函数 public static string GetVarName(Expression<Func<变量类型, 变量类型>> exp) public static string GetVarName_Int(Expression<Func<int, int>> exp){return ((MemberExpression)exp.Body).Member.Name;}使用时…

视频通话研究002

还是关于视频质量。经測试&#xff0c;在公网server使用SQCIF(128x98)进行视频通话。2个client都是这个设置&#xff0c;感觉不出马赛克&#xff0c;模糊严重&#xff0c;在一个手机client抓包&#xff0c;例如以下&#xff1a; 第1,2行是client发到server的数据&#xff1b;第…

实力打脸: 量子隐形传输与 “瞬间移动” 毫无关系

有两个团队已经在量子隐形传输研究领域创造了新的传输记录&#xff1a;利用深不可测的量子力学知识将一个粒子的量子态迅速从一个位置迁移到另一个位置的粒子上。其中一个团队采用这种方法&#xff0c;运用一种光学纤维将一个光子的量子态穿越加拿大西南部的一个城市&#xff0…

Android初级教程:使用xml序列器

之前备份短信的时候生成xml都是手动拼写的&#xff0c;有一个问题&#xff1a;当短信里面存在</body>这样的标签的时候&#xff0c;最后结果就不是完整的xml文件&#xff0c;显然出错。但是&#xff0c;今天使用序列化器的方式&#xff0c;就能有效的解决上边遇到的问题。…

架构师之我见

架构师之我见 2009-08-06 架构师是一个项目组的灵魂人物&#xff0c;他决定着整个系统的技术选型、整体架构以及模块划分&#xff0c;同时还可能担当与领导层的沟通角色&#xff0c;从某种意义上来说&#xff0c;架构师在很大程度上决定着项目的成败与否&#xff0c;正所谓火车…

KUKA 声明变量时的几点注意

临时变量&#xff1a; 1、src文件中定义的局部变量&#xff0c;该种变量存在于内存中的栈上。子程序调用时&#xff0c;变量在栈上动态生成。调用结束后从栈中自动销毁。 因为存在于栈上的原因&#xff0c;访问该变量需要栈指针&#xff0c;所以该种变量无法在机器人程序运行时…

三个点拟合圆形的函数C#

三个点拟合圆形的函数 函数说明 public void FitCircleFromThreePoints(double 点1X, double 点1Y, double 点2X, double 点2Y, double 点3X, double 点3Y, out double 圆心X坐标, out double 圆心Y坐标, out double 圆形半径大小)public void FitCircleFromThreePoints(doub…

poj3264Balanced Lineup(倍增ST表)

Balanced LineupTime Limit: 5000MS Memory Limit: 65536KTotal Submissions: 52328 Accepted: 24551Case Time Limit: 2000MSDescription For the daily milking, Farmer Johns N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer John decides to …

LightOJ1283 Shelving Books(DP)

题目 Source http://www.lightoj.com/volume_showproblem.php?problem1283 Description You are a librarian. You keep the books in a well organized form such that it becomes simpler for you to find a book and even they look better in the shelves. One day you ge…

量子传输技术转移一个人需要4500万亿年

看过《星际迷航》的朋友一定不会忘记这句经典的台词&#xff1a;斯科蒂&#xff0c;将我传输过去&#xff01;其中涉及到量子隐形传输的技术&#xff0c;可以把物体从三维时空一处传输到另一处。但可惜的是&#xff0c;这种看着非常炫的技术或许根本无法实现。 到目前为止&…

使用OutputDebugString帮助调试

使用OutputDebugString帮助调试 前面我已经介绍了使用TRACE来帮助我们调试&#xff0c;但使用TRACE有一个限制&#xff0c;只能在将程序DEBUG编译状态下才能使用&#xff0c;下面我们介绍OutputDebugString函数&#xff0c;通过它&#xff0c;可以在在DEBUG或RELEASE情况也可以…

leetcode-551-Student Attendance Record I(判断是否出现连续几个相同字符)

题目描述&#xff1a; You are given a string representing an attendance record for a student. The record only contains the following three characters: A : Absent.L : Late.P : Present.A student could be rewarded if his attendance record doesnt contain more t…