C++之tinyXML的使用详解

tinyXML一款很优秀的操作C++类库,文件不大,但方法很丰富,和apache的Dom4j可以披靡啊!习惯了使用java类库的我看到这么丰富的c++类库,很高兴!它使用很简单,只需要拷贝几个文件到你的工程中,没有STL也可以编译运行。 
    
    下面我从这几个方面谈谈对tinyXML类库的使用以及理解。

首先在sourceforge上下载tinyXML类库,地址:http://sourceforge.net/projects/tinyxml/

然后解压缩tinyXML后,将这六个文件添加到你的c++工程中,分别是tinystr.h、tinystr.cpp、tinyxml.h、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp。在需要操作xml文件的地方,使用如下代码,就可以引入tinyXML类库。

  1. C++代码
    #include<tinyxml>  
    
    或者
    C++代码
    #include "tinyxml.h"  

下面我用个简单的例子说明如何使用tinyXML操作xml文件。在讲例子之前我先说说tinyXML中主要类和xml文档之间的对应关系。下面是tinyXML中主要class的类图,反应各个类之间的静态关系。

引用来自tinyXML文档

TiXmlBase是所有类的基类,TiXmlNode、TiXmlAttribute两个类都继承来自TiXmlBase类,其中TiXmlNode类指的是所有被<...>...<.../>包括的内容,而xml中的节点又具体分为以下几方面内容,分别是声明、注释、节点以及节点间的文本,因此在TiXmlNode的基础上又衍生出这几个类TiXmlComment、TiXmlDeclaration、TiXmlDocument、TiXmlElement、TiXmlText、TiXmlUnknown,分别用来指明具体是xml中的哪一部分。TiXmlAttribute类不同于TiXmlNode,它指的是在尖括号里面的内容,像<... ***=...>,其中***就是一个属性。这块我具体用一个xml文档说明一下,内容如下:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <phonebook>
 3     <!--one item behalfs one contacted person.-->
 4     <item>
 5         <name>miaomaio</name>
 6     <addr>Shaanxi Xi‘an</addr>
 7     <tel>13759911917</tel>
 8     <email>[email protected]</email>
 9     </item>
10     <item>
11         <name>gougou</name>
12     <addr>Liaoning Shenyang</addr>
13     <tel>15840330481</tel>
14     <email>[email protected]</email>
15     </item>
16     <!--more contacted persons.-->
17 </phonebook>  
  • 像TiXmlDeclaration指的就是<?xml version="1.0" encoding="UTF-8"?>,
  • 像TiXmlComment指的就是<!--one item behalfs one contacted person.-->、 <!--more contacted persons.-->,
  • 像TiXmlDocument指的就是整个xml文档,
  • 像TiXmlElement指的就是<phonebook>、<item>、<name>、<addr>等等这些节点,
  • 像TiXmlText指的就是‘gougou’、‘15840330481’这些夹在<item>与</item>、<name>与</name>、<addr>与</addr>之间的文本文字,
  • 像TiXmlAttribute指的就是<?xml version="1.0" encoding="UTF-8"?>节点中version、encoding,
  • 除此之外就是TiXmlUnknown。

如何析xml文档,一般是这样的:

1 加载xml

2 获得根元素

3 获取任意一个元素

4 对元素进行解析。

 1 //______________________________________________________________________
 2 // Read information from xml file.
 3
 4 // define xml file path, as follow , we use relative path,
 5 // but you can use absolute path also.
 6 const char* filepath = "phonebookdata.xml";
 7 TiXmlDocument doc(filepath);
 8 bool loadOkay = doc.LoadFile();
 9 // faile to load ‘phonebookdata.xml‘.
10 if (!loadOkay) {
11     printf( "Could not load test file %s. Error=‘%s‘. Exiting.\n", filepath,doc.ErrorDesc() );
12     exit( 1 );
13 }
14
15 // get dom root of ‘phonebookdata.xml‘, here root should be ‘phonebook‘.
16 TiXmlElement* root = doc.RootElement();
17
18 printf("_______________________________________\n\n");
19 printf("     contacted person information      \n\n");
20 // trace every items below root.
21 for( TiXmlNode*  item = root->FirstChild( "item" );
22          item;
23          item = item->NextSibling( "item" ) ) {
24     printf("_______________________________________\n");
25
26     // read name.
27     TiXmlNode* child = item->FirstChild();
28     const char* name = child->ToElement()->GetText();
29     if (name) {
30         printf("name:%s\n",name);
31     } else {
32         printf("name:\n");
33     }
34
35     // read address.
36     child = item->IterateChildren(child);
37     const char* addr = child->ToElement()->GetText();
38     if (addr) {
39         printf("addr:%s\n",addr);
40     } else {
41         printf("addr:\n");
42     }
43
44
45     // read telephone no.
46     child = item->IterateChildren(child);
47     const char* tel = child->ToElement()->GetText();
48         if (tel) {
49         printf("tel:%s\n",tel);
50     } else {
51         printf("tel:\n");
52     }
53
54     // read e-mail.
55     child = item->IterateChildren(child);
56     const char* email = child->ToElement()->GetText();
57     if(email) {
58         printf("email:%s\n",email);
59     } else {
60         printf("email:\n");
61     }
62
63     printf("\n");
64
65 }
66 //______________________________________________________________________
67
68
69 //______________________________________________________________________
70 // Add information to xml file and save it.
71 TiXmlElement* writeRoot = doc.RootElement();
72 TiXmlNode* newNode = new TiXmlElement("item");
73
74    const TiXmlNode* name4NewNode = new TiXmlElement("name");
75 newNode->InsertEndChild(*name4NewNode)->InsertEndChild(TiXmlText("pipi"));
76
77 const TiXmlNode* addr4NewNode = new TiXmlElement("addr");
78 newNode->InsertEndChild(*addr4NewNode)->InsertEndChild(TiXmlText("Shaanxi Xianyang"));
79
80 const TiXmlNode* tel4NewNode = new TiXmlElement("tel");
81 newNode->InsertEndChild(*tel4NewNode)->InsertEndChild(TiXmlText("02937310627"));
82
83 const TiXmlNode* email4NewNode = new TiXmlElement("email");
84 newNode->InsertEndChild(*email4NewNode)->InsertEndChild(TiXmlText("[email protected]"));
85
86 writeRoot->InsertEndChild(*newNode);
87 doc.SaveFile();
88 //______________________________________________________________________  
时间: 2024-10-20 08:11:53

C++之tinyXML的使用详解的相关文章

转:修改ETM,用Ogre实现《天龙八部》地形与部分场景详解

本文主要讲的是<天龙八部>游戏的地形和一部分场景的具体实现,使用C++, Ogre1.6,我摸索了段时间,可能方法用的并不是最好的,但好歹实现了.文章可能讲得有点罗嗦,很多简单的东西都讲了.我是修改了ETM(Editable Terrain Manager)实现的地形,其实单单实现天龙八部的地形场景等的载入根本不需要使用ETM,直接用Ogre的顶点->索引->纹理就可以搞定地形,但我要做的是可以实时编辑的,所以用了ETM,场景其由于很重要的粒子和model等部分我还没去看,所以等以

TiXml使用详解

http://blog.sina.com.cn/s/blog_676cdfb10100s2bx.html 本文用一个详细的例子说明了TiXml的使用方法.如写.查找.插入.替换.加载.遍历等常见操作. 首先简单介绍一下TinyXml,要看详细的在网上搜搜了^_^: TinyXML是一个简单小巧,可以很容易集成到其它程序中的C++ XML解析器.简单地说,TinyXML解析一个XML文档并由此生成一个可读可修改可保存的文档对象模型(DOM).TinyXML使用文档对象模型(DOM),这意味着XML

C++中头文件与源文件的作用详解

一.C++ 编译模式 通常,在一个 C++ 程序中,只包含两类文件―― .cpp 文件和 .h 文件.其中,.cpp 文件被称作 C++ 源文件,里面放的都是 C++ 的源代码:而 .h 文件则被称作 C++ 头文件,里面放的也是 C++ 的源代码. C++ 语言支持"分别编译"(separatecompilation).也就是说,一个程序所有的内容,可以分成不同的部分分别放在不同的 .cpp 文件里..cpp 文件里的东西都是相对独立的,在编译(compile)时不需要与其他文件互通

Spring事务管理(详解+实例)

写这篇博客之前我首先读了<Spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: Spring事务机制详解 Spring事务配置的五种方式 Spring中的事务管理实例详解 1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是要么都执行要么都

转载:DenseNet算法详解

原文连接:http://blog.csdn.net/u014380165/article/details/75142664 参考连接:http://blog.csdn.net/u012938704/article/details/53468483 本文这里仅当学习笔记使用,具体细节建议前往原文细度. 论文:Densely Connected Convolutional Networks 论文链接:https://arxiv.org/pdf/1608.06993.pdf 代码的github链接:h

MariaDB(MySQL)创建、删除、选择及数据类型使用详解

一.MariaDB简介(MySQL简介略过) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品.在存储引擎方面,使用XtraDB(英语:XtraDB)来代替MySQL的InnoDB. MariaDB由MySQL的创始人Michael Widenius(英语:Michael Widenius)主导开发,他早前曾以10亿美元的价格,将自己创建的公司MySQL A

HttpServletResponse和HttpServletRequest详解

HttpServletResponse,HttpServletRequest详解 1.相关的接口 HttpServletRequest HttpServletRequest接口最常用的方法就是获得请求中的参数,这些参数一般是客户端表单中的数据.同时,HttpServletRequest接口可以获取由客户端传送的名称,也可以获取产生请求并且接收请求的服务器端主机名及IP地址,还可以获取客户端正在使用的通信协议等信息.下表是接口HttpServletRequest的常用方法. 说明:HttpServ

POSIX 线程详解(经典必看)

总共三部分: 第一部分:POSIX 线程详解                                   Daniel Robbins ([email protected]), 总裁/CEO, Gentoo Technologies, Inc.  2000 年 7 月 01 日 第二部分:通用线程:POSIX 线程详解,第 2部分       Daniel Robbins ([email protected]), 总裁/CEO, Gentoo Technologies, Inc.  20

.NET深入解析LINQ框架(五:IQueryable、IQueryProvider接口详解)

阅读目录: 1.环路执行对象模型.碎片化执行模型(假递归式调用) 2.N层对象执行模型(纵横向对比链式扩展方法) 3.LINQ查询表达式和链式查询方法其实都是空壳子 4.详细的对象结构图(对象的执行原理) 5.IQueryable<T>与IQueryProvider一对一的关系能否改成一对多的关系 6.完整的自定义查询 1]. 环路执行对象模型.碎片化执行模型(假递归式调用) 这个主题扯的可能有点远,但是它关系着整个LINQ框架的设计结构,至少在我还没有搞懂LINQ的本意之前,在我脑海里一直频