




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
TinyXML 之之简简单应用单应用 TinyXML 之简单应用之简单应用 TinyXml 是 for C+的一个小巧易用的 XML 读写工具,下面我们来看看其如何它。 T Ti in ny yX XMML L 基基础础 在 TinyXml 中,有以下一些基本的元素(class) , 它们与 xml 文件中的各个部分相对应。 举个例子,来看看其相互之间是如何对应的。 假设我们有如下的一个 XML 文件: Kasi Gosla 则与 TinyXml 元素的对应关系,如下: TiXmlDocument demo.xml TiXmlDeclaration version=1.0 TiXmlComment This is comment here. TiXmlElement Data TiXmlElement Player Attribtutes: level=12 TiXmlText Kasi TiXmlElement Player TiXmlText Gosla 下面来大体解说一下转换的缘由,一些概念若不大明白,不必着急,一直往下看,便可 明了。 是一个声明, 将其转化为 TiXmlDeclaration, 它是 TiXmlDocument 的第一个 child。它是一个指令或者说是特殊的标签,所以在使用的时候,常把它转化为 TiXmlUnknown(处理的时候照着原样写出来) ,这样它的信息就不会丢失。 Copyright 2005, 9F Studio TinyXML 之之简简单应用单应用 文档的注释,转化为 TiXmlComment 这个标签对应于一个 TiXmlElement,其没有具体的属性(attribute) ,而是含有另外两个 child() 。 这个就是的 child, 也是一个 TiXmlElement 元素, 它具有一个属性 (属性名为 level, 值为 12) Kasi 这是的 child,为一个 TiXmlText。其为叶节点(leaf node) ,即不再 含有其他的 child。 文文件件的的打打开开与与关关闭闭 下面的例子,我们将使用 TinyXML,从程序中生成上面的 XML 文件。从例子中,可以 看到如何打开、保存文件。 / sample/demotest.cpp #include #include #include tinyxml.h / XML file content const char * demoStart = n n n Kasin Goslan n; int main() / Write to a file and read it back, to check file I/O. TiXmlDocument OutputDoc( demotest.xml ); OutputDoc.Parse( demoStart ); if ( OutputDoc.Error() ) printf( Error in %s: %sn, Copyright 2005, 9F Studio TinyXML 之之简简单应用单应用 OutputDoc.Value(), OutputDoc.ErrorDesc() ); exit( 1 ); OutputDoc.SaveFile(); TiXmlDocument InputDoc( demotest.xml ); bool loadOkay = InputDoc.LoadFile(); if ( !loadOkay ) printf( Could not load demotest.xml: Error=%s.n, InputDoc.ErrorDesc() ); exit( 1 ); return 0; 打开一个文件,其实还可以这样写: TiXmlDocument InputDoc; bool loadOkay = InputDoc.LoadFile( demotest.xml ); 一切依据个人喜好而定。 读读取取文文件件中中的的数数据据 下面,我们来看看,如何从 XML 文件中将数据读出。 为完整演示TinyXML的功能, 我们需要一个更复杂一些的XML文件, 如下 (demo.xml) : Kasi Gosla 13 0.3 Wonderful guy! 完整的实例代码如下: / sample/readdata.cpp Copyright 2005, 9F Studio TinyXML 之之简简单应用单应用 #include #include #include #include tinyxml.h int main() TiXmlDocument doc; bool loadOkay = doc.LoadFile( demo.xml ); if ( !loadOkay ) printf( Could not load demo.xml. Error=%s.n, doc.ErrorDesc() ); exit( 1 ); /- / begin to read data /- TiXmlNode * node = 0; TiXmlElement * dataElement = 0; TiXmlElement * itemElement = 0; TiXmlComment * itemComment = 0; TiXmlText * itemText = 0; int level = 0; double rate = 0; std:string name, desc; / Get the Data element. / It is a child of the document, and can be selected by name. node = doc.FirstChild( Data ); dataElement = node-ToElement(); / Get the comment node = dataElement-FirstChild(); itemComment = node-ToComment(); Copyright 2005, 9F Studio TinyXML 之之简简单应用单应用 printf( comment: %sn, itemComment-Value() ); / Get the first Player / Using FirstChildElement can skip the comment. node = dataElement-FirstChildElement(); itemElement = node-ToElement(); itemText = itemElement-FirstChild()-ToText(); / query attributes itemElement-QueryIntAttribute( level, itemElement-QueryDoubleAttribute( rate, desc = itemElement-Attribute( desc ); name = itemText-Value(); / Output infomation printf( name: %s, level: %d, rate: %f, desc: %sn, name.c_str(), level, rate, desc.c_str() ); / Get the second Player / IMPORTANT: Its itemElement:NextSiblingElement() / been called, not dataElements. itemElement = itemElement-NextSiblingElement(); / Get name itemElement = itemElement-FirstChildElement(); itemText = itemElement-FirstChild()-ToText(); name = itemText-Value(); / Get level itemElement = itemElement-NextSiblingElement(); itemText = itemElement-FirstChild()-ToText(); level = atoi( itemText-Value() ); / Get rate itemElement = itemElement-NextSiblingElement(); itemText = itemElement-FirstChild()-ToText(); rate = atof( itemText-Value() ); / Get desc itemElement = itemElement-NextSiblingElement(); itemText = itemElement-FirstChild()-ToText(); desc = itemText-Value(); Copyright 2005, 9F Studio TinyXML 之之简简单应用单应用 / Output infomation printf( name: %s, level: %d, rate: %f, desc: %sn, name.c_str(), level, rate, desc.c_str() ); return 0; 执行结果: comment: This is comment here. name: Kasi, level: 12, rate: 0.200000, desc: Great guy! name: Gosla, level: 13, rate: 0.300000, desc: Wonderful guy! 下面将讲解上面的示例。 获取一个 node 的 child 的时候,可以有多种方法,比如: node = doc.FirstChild( Data ); dataElement = node-ToElement(); 则取得第一名为 Data 的 child。如果这里未填参数,获得的将是。 一般,我们可以依据两种方法(上面实例中所用的方法) ,遍历同一层次上的 child。伪 代码如下: / 遍历所有的 child for( node = parentNode.FirstChild(); node; node = node-NextSibling() ) / do something / 遍历所有名为 test 的 child for( node = parentNode.FirstChild( “test” ); node; node = node-NextSibling() ) / do something / 遍历所有的类型为 TiXmlElement 的 child for( element = parentElement-FirstChildElement(); element; element = element-NextSiblingElement() ) Copyright 2005, 9F Studio TinyXML 之之简简单应用单应用 / do something XML 文件中,保存数据的方法有两种,一种是放在属性里,如下: Kasi 另一种是分项,一一列出写: Gosla 13 0.3 Wonderful guy! 其实两者效果差不多,不过,在 TinyXML 中,前者使用起来更方便,而后者对于 XML 文件,则更清晰明了。 读取属性值,我们可通过 TiXmlElement 中提供的三个函数: / query attributes itemElement-QueryIntAttribute( level, itemElement-QueryDoubleAttribute( rate, desc = itemElement-Attribute( desc ); 而对于第二种方法,则 int 和 double 的转换,只能由我们手工完成了: / Get name . name = itemText-Value(); / Get level . level = atoi( itemText-Value() ); / 手工转换 / Get rate . rate = atof( itemText-Value() ); / 手工转换 对于字符串(string)的保存,我推荐使用 std:string,这样可方便的赋值而不必考虑字 符串的长度问题。 最后一个要说的地方, 就是, TiXmlNode 有一函数 Value(), 对于不同的子类 (sub-class) , 其有不同的含义。 Document: filename of the xml file Element: name of the element Comment: the comment text Unknown: the tag contents Text: the text string Copyright 2005, 9F Studio TinyXML 之之简简单应用单应用 数数据据的的写写入入 依旧使用上面的例子,我们来看看如何修改 XML 文件,以及如何添加新的 element。 修改前的文件如下: Kasi Gosla 13 0.3 Wonderful guy! 修改后,要达到一下效果: Kasi Firefox QQ 13 0.3 Wonderful guy! 红色为修改处。 我们先来看代码: / sample/writedata.cpp #include tinyxml.h int main() TiXmlDocument doc( demo.xml ); bool loadOkay = doc.LoadFile( demo.xml ); if ( !loadOkay ) Copyright 2005, 9F Studio TinyXML 之之简简单应用单应用 printf( Could not load demo.xml. Error=%s.n, doc.ErrorDesc() ); exit( 1 ); TiXmlNode * node = 0; TiXmlElement * dataElement = 0; TiXmlElement * itemElement = 0; TiXmlText * itemText = 0; node = doc.FirstChild( Data ); dataElement = node-ToElement(); / / Modify attribute / / Get first itemElement = dataElement-FirstChildElement(); itemElement-SetAttribute( level, 90 ); itemElement-SetDoubleAttribute( rate, 0.8 ); itemElement-RemoveAttribute( desc ); / remove one itemElement-SetAttribute( new, new ); / / Modify TiXmlText value / / Get second itemElement = itemElement-NextSiblingElement(); / Get itemElement = itemElement-FirstChildElement(); / Get TiXmlText Gosla itemText = itemElement-FirstChild()-ToText(); itemText-SetValue( QQ ); / Gosla - QQ / / Insert new elements / Copyright 2005, 9F Studio TinyXML 之之简简单应用单应用 / Create nodes TiXmlElement newElement( Player ); newElement.SetAttribute( level, 10 ); TiXmlText newText( Firefox ); newElement.InsertEndChild( newText ); / Insert to the document / Get the first itemElement = dataElement-FirstChildElement(); dataElement-InsertAfterChild( itemElement, newElement ); / Save file doc.SaveFile(); return 0; 修改 XML 的数据,包括修改属性值或是 TiXmlNode 的值。 修改属性值,调用一下几个函数即可(用法见示例) : TiXmlElement: SetAttribute() / 包括设置 int 或 string TiXmlElement: SetDoubleAttribute() TiXmlElement: RemoveAttribute() 修改 TiXmlNode 的值,调用 SetValue()即可。 TiXmlNode:SetValue() 其对于不同类型的 Node,其含义当然也不一样啦(具体区别见上节对函数 Value()的介 绍) 。 而创建新的元素(element) 。在元素创建完毕后,可以调用一下函数将其插入到整个起 父节点(parent node)中。 TiXmlNode:InsertBeforeChild() / 在某个 child 之前插入 TiXmlNode:InsertBeforeChild() / 在某个 child 之后插入 TiXmlNode:InsertEndChild() / 插入到所有 child 之后 其实修改 XML 与读取数据很相似, 只是使用不同的几个函数罢了, 这里也就不再赘述。 关关于于中中文文的的支支持持 按道,在标签加入 encoding 选项,便可使用 各种文字了,可测试时,只成功了一次,以后又不成功了,具体原因不明。 此部分暂时空缺。 Copyright 2005, 9F Studio TinyXML 之之简简单应用单应用 在 Linux 测试通过,应该是 Windows 上的 console 不支持 UTF-8 的原因。 一一些些小小问问题题 1. TinyXml 对对 C+标准库的支持标准库的支持 TinyXml 对 C+标准库也作了支持,只需在 tinyxml.h 的第一行加入 #define TIXML_USE_STL 则 SetValue()等函数,都有了针对 std:string 的 override 版本;以及对 iostream 等的一些支持 (iostream 的示例见下) 。TinyXml 对标准库的支持有些问题,不推荐使用(原因见下) 。 2. 空格的解析空格的解析 对于语句中的空格 Hello_world,_Hello_world_, (”_”为空格的表示) ,tinyxml 会自动的进行处理为 Hello_world,也可以调用 TiXmlBase
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 汽电机组拆装合同协议书
- 监理公司合同的补充协议
- 派遣固定期劳动合同范本
- 银行担保人签订合同范本
- 淘宝店铺运营服务协议书
- 生活垃圾代管协议书模板
- 私下将租赁合同转让协议
- 济南机场战略合作协议书
- 聘用协议性质为劳动合同
- 终止造林合同协议书范本
- WB/T 1115-2021体外诊断试剂温控物流服务规范
- GB/T 32350.2-2015轨道交通绝缘配合第2部分:过电压及相关防护
- GB/T 23261-2009石材用建筑密封胶
- GB/T 1796.1-2016轮胎气门嘴第1部分:压紧式内胎气门嘴
- 转包违法分包等违法行为认定查处管理办法讲座课件
- 劳资专管员任命文件(样本)
- 哔哩哔哩认证公函
- 托玛琳养生碗gg课件
- 水产养殖示范基地建设项目实施方案
- 行政后勤人员 三级安全教育培训记录卡
- 河北省张家口市各县区乡镇行政村村庄村名居民村民委员会明细
评论
0/150
提交评论