TinyXml 优秀的开源 xml 解析器
TinyXml 优秀的开源 xml 解析器
2010-08-11 11:10:04
分类:C/C++ 读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。 DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。 如下是一个XML片段: 代码链接:TinyXml.zip
在TinyXML中,根据XML的各种元素来定义了一些类: TiXmlBase:整个TinyXML模型的基类。 TiXmlAttribute:对应于XML中的元素的属性。 TiXmlNode:对应于DOM结构中的节点。 TiXmlComment:对应于XML中的注释 TiXmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0"?>。 TiXmlDocument:对应于XML的整个文档。 TiXmlElement:对应于XML的元素。 TiXmlText:对应于XML的文字部分 TiXmlUnknown:对应于XML的未知部分。 TiXmlHandler:定义了针对XML的一些操作。 TinyXML是个解析库,主要由DOM模型类(TiXmlBase、TiXmlNode、TiXmlAttribute、TiXmlComment、TiXmlDeclaration、TiXmlElement、TiXmlText、TiXmlUnknown)和操作类(TiXmlHandler)构成。它由两个头文件(.h文件)和四个CPP文件(.cpp文件)构成,用的时候,只要将(tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp)导入工程就可以用它的东西了。如果需要,可以将它做成自己的DLL来调用。举个例子就可以说明一切。。。 对应的XML文件:
读写XML文件的程序代码:
官方下载地址:http://www.oschina.net/p/tinyxml 本地下载地址:http://blogimg.chinaunix.net/blog/upfile2/100822222318.zip 在TinyXML中,根据XML的各种元素来定义了一些类: 例如:
整个对象树: TiXmlDocument "demo.xml" TiXmlDeclaration "version=’1.0′" "standalone=no" TiXmlComment " Our to do list data" TiXmlElement "ToDo" TiXmlElement "Item" Attribtutes: priority = 1 TiXmlText "Go to the " TiXmlElement "bold" TiXmlText "Toy store!" TiXmlElement "Item" Attributes: priority=2 TiXmlText "Do bills" 在tinyXML中,用FirstChild("名字")查找节点时,调用FirstChild函数的节点与要查找的节点必须成“父子关系”。 句柄 想要健壮地读取一个XML文档,检查方法调用后的返回值是否为null是很重要的。一种安全的检错实现可能会产生像这样的代码:
用句柄的话就不会这么冗长了,使用TiXmlHandle类,前面的代码就会变成这样:
一、读取XML,设置节点文本 如下XML片段:
要设置BROADCAST_VERSION节点的值 8为其他值,可参考如下代码(将值加1):
二,删除节点,属性值
TiXmlHandledocHandle(
&
doc);
TiXmlElement * Broadcast_ver = docHandle.FirstChild( " ZXML ).FirstChild( ZAPP VBS_RUNTIME_PARAMS ).ToElement(); TiXmlNode node -> FirstChild( BROADCAST_VERSION ); Broadcast_ver RemoveChild(node); 也可以删除整个SOURCE_1节点:
Broadcast
SOURCE_1
);
Broadcast RemoveChild(node); 删除BROADCAST_VERSION的info属性:
).FirstChildElement(
).ToElement();
Broadcast_ver RemoveAttribute( info ); // 删除info 可以借助NextSiblingElement()方法实现递归删除. 三,添加节点,属性值 例如在SOURCE_3下添加BROADCAST_PID节点:
).ToElement();
TiXmlElement Broadcast_Pid new TiXmlElement( BROADCAST_PID ); TiXmlText text TiXmlText( 7215 ); Broadcast_Pid SetAttribute( , thepid LinkEndChild(text); Broadcast LinkEndChild(Broadcast_Pid); 将在SOURCE_3后添加新的节点:
<
BROADCAST_PID
="thepid"
>
</
>
四,最后说一下中文乱码的问题 乱码是由于GB2312与UTF8之间转换不当造成的,tinyxml在处理UTF8本身没有问题,当你打开一个UTF8的文档,可以在加载的时候指定UTF8的方式,或者文档声明处指明的编码格式,tinyxml会按照相应的编码格式加载,但很多时候当我们输出或写入中文字段时会出现乱码,无论在内存,还是打印出来的内容.这是因为我们的软件通常是GB2312编码,而读取或写入的内容是UTF8,自然就会出错.可以借助网上的两个函数来实现转换(原作者不详):
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- c# – 如何通过REST api向JIRA创建问题?
- Oracle 11g 安装配置方法图文教程
- ruby-on-rails – Ruby 2.0改变了SimpleDelegator的行为吗?
- React-Native ES6使用语法和underscore的使用
- ruby-on-rails – Rails 3路由到错误的控制器
- WinCE中nandflash驱动开发介绍
- Apache-DBCP数据库连接池的使用
- 关于正则表达式^和小括号()匹配导致重复项的问题
- .net – DataContractJsonSerializer何时包含类型信息?
- ruby-on-rails – 尽管链路存在,RSpec应该has_link失败