转自http://www.360doc.com/content/13/1223/16/3684846_339528825.shtml,尊重原文

什么是XML?

XML全称EXtensible Markup Language,翻译为可扩展标记语言,简而言之就是你可以自定义数据的标识,以此来区分各种不同的数据,以便于进行数据交换,例如html就可以理解为一种简单的xml语言。XML文件通常就是一个文本文件,可以使用任何编码。

 

上图就是我系统中一个xml文件的图标,使用VC2005打开它,你可以看到如下内容:

 

XML也是有这几个对象组成了,一般来说我们经常使用的类如下:

l TiXmlDocument:文档类,它代表了整个xml文件。

l TiXmlDeclaration:声明类,它表示文件的声明部分,如上图所示。

l TiXmlComment:注释类,它表示文件的注释部分,如上图所示。

l TiXmlElement:元素类,它是文件的主要部分,并且支持嵌套结构,一般使用这种结构来分类的存储信息,它可以包含属性类和文本类,如上图所示。

n TiXmlAttribute/TiXmlAttributeSet:元素属性,它一般嵌套在元素中,用于记录此元素的一些属性,如上图所示。

n TiXmlText:文本对象,它嵌套在某个元素内部,如上图所示。

 

保存文档对象

 

当然你也可以使用SaveFile()函数来进行另存为,这个函数的原形如下:

bool SaveFile( const std::string& filename ) const

在程序中你可以如下使用:

 

//载入xml文档

TiXmlDocument doc("tutorial.xml");

doc.LoadFile();

doc.Print(); //输出文档

cout<<endl;

doc.SaveFile("tutorial.txt");

使用记事本打开tutorial.txt,你可以看到如下内容。

 

 

 

返回第一个根元素

 

另外文档对象还提供了一个实用的函数用于返回第一个根对象,它可以让你方便的遍历整个文档结构,查找自己需要的数据。函数原形如下:

+TiXmlElement* RootElement()

我们在介绍元素类的时候再详细介绍它的使用。

声明类

 

在标准的XML文件中,声明为文件的第一项,例如<?xml version="1.0" standalone="yes"?>,声明对象具有三个属性值,版本,编码和独立文件声明

一般来说文档的第一行就是声明对象,你可以把文档对象的第一个子节点转换为声明对象。

 

//使用TinyXml的声明对象

TiXmlDeclaration *decl;

decl = doc.FirstChild()->ToDeclaration();

然后就可以使用它的功能了,它可以让你返回当前的版本,编码等信息,函数原形如下:

+const char *Version() const

+const char *Encoding() const

+const char *Standalone() const

在程序中你可以如下使用:

 

//使用TinyXml的声明对象

TiXmlDeclaration *decl;

decl = doc.FirstChild()->ToDeclaration();

cout<<"使用TinyXml的声明对象(TiXmlDeclaration)"<<endl;

//输出声明对象对应的xml内容

decl->Print(0,4,&str);

cout<<str<<endl;

//分别输出声明对象的属性

cout<<"版本:"<<decl->Version()<<" 是否为对立文件:"<<decl->Standalone()<<" 编码方式:"<<decl->Encoding()<<endl;

cout<<endl;

 

 

注释类

 

这个类一般为xml数据提供解释说明,在程序中一般不使用它,因此,这里就不介绍了。

元素类

 

元素为一个容器类,它具有元素名称,并可以包含其它元素,文本,注释和未知节点,这些对象统称为元素的节点,即节点可以为元素、文本、注释和未知节点类型。元素也可以包含任意个数的属性。

我们还是以如下的XML代码来说明这个类的功能。

 

<element attribute="this a attribute(这是一个属性)" int= "1" float = "3.14">

<subelement1>

This a text(这是一个文本)

</subelement1>

<subelement2/>

<subelement3/>

<subelement4/>

</element>

节点名

 

在上方元素的代码中,element为根元素的名称,你可以通过如下的函数来设置和返回它。

+const std::string& ValueStr() const

+void SetValue( const std::string& _value )

父节点

 

subelement1,subelement2,subelement3,subelement4都是element的子元素,如果当前元素对象的指针指向subelement1,subelement2,subelement3,subelement4,你可以通过Parent()函数来返回指向element对象的指针,Parent()函数的声明如下:

+TiXmlNode* Parent()

子节点

 

通过父节点的指针,你可以遍历所有的子节点。

+TiXmlNode* FirstChild()

+TiXmlNode* FirstChild( const std::string& _value )

上面两个函数用于返回第一个子节点对象的指针,带参数名的那个函数表示返回第一个名为_value的子节点。

+TiXmlNode* LastChild()

+TiXmlNode* LastChild( const std::string& _value )

上面的两个函数用于返回最后一个节点对象的指针,带参数名的那个函数表示返回最后一个名为_value的子节点。

你也可以使用IterateChildren()函数来依次遍历所有的节点,它们的函数声明如下:

+TiXmlNode* IterateChildren( const TiXmlNode* previous )

+TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous )

带参数名的那个函数表示只遍历同名的节点。

编辑子节点

 

你可以插入、删除替换所有的子节点。

+TiXmlNode* InsertEndChild( const TiXmlNode& addThis );

+TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis );

+TiXmlNode* InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis );

上面三个函数用于插入节点,InsertEndChild函数让你把新节点插入到末尾,InsertBeforeChild和InsertAfterChild函数允许你在指定的节点位置前后插入节点。

+TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis );

ReplaceChild函数用于替换指定的节点。

+bool RemoveChild( TiXmlNode* removeThis );

RemoveChild函数让你删除指定的节点。

void Clear();

Clear函数会删除本节点的所有子节点(包括子节点包含的从子节点),但不会修改本节点。

同级节点

 

 

<element attribute="this a attribute(这是一个属性)" int= "1" float = "3.14">

<subelement1>

This a text(这是一个文本)

</subelement1>

<subelement2/>

<subelement3/>

<subelement4/>

</element>

在上面的xml代码中,subelement1、subelement2、subelement3、subelement4都属于同级节点,我们也提供了相关的函数用于在这些同级节点中遍历。

+TiXmlNode* PreviousSibling()

+TiXmlNode* PreviousSibling( const std::string& _value )

可以根据当前的节点,返回上一个节点的指针。带参数名的那个函数表示返回上一个名为_value的节点。

当然你也可以根据当前的节点,返回下一个节点的指针。带参数名的那个函数表示返回下一个名为_value的节点。

+TiXmlNode* NextSibling()

+TiXmlNode* NextSibling( const std::string& _value)

遍历元素

 

元素是一种特殊的节点,以'<'为开始字符,后接元素名称。函数NextSiblingElement用于返回下一个同级元素,而忽略其它类型的节点。它们的函数声明如下:

+TiXmlElement* NextSiblingElement()

+TiXmlElement* NextSiblingElement( const std::string& _value)

带参数名的那个函数表示返回下一个名为_value的同级元素。

本类也提供了相关的函数,让你返回第一个子元素。

+TiXmlElement* FirstChildElement()

+TiXmlElement* FirstChildElement( const std::string& _value )

带参数名的那个函数表示返回下一个名为_value的子元素。

元素属性

 

属性一般保存在元素中,它们为使用"="号连接的两个字符串,左边的表示属性名,等号右边的表示属性值,通常使用字符串、整数和浮点数等数据类型表示。例如,pi = 3.14。

你可以通过如下的函数,返回属性值。

+const std::string* Attribute( const std::string& name ) const;

+const std::string* Attribute( const std::string& name, int* i ) const;

+const std::string* Attribute( const std::string& name, double* d ) const;

在上面3个函数中,第一个函数使用字符串保存返回的属性值,第二个函数把属性值转换为整数然后返回,第三个函数把属性值转换为浮点数然后返回。不过,第二、三个函数都会以字符串的形式记录属性值,并作为函数的返回值返回。

另外,你也可以使用模板函数:

+template< typename T > int QueryValueAttribute( const std::string& name, T* outValue ) const

来返回特点的属性值,它会根据你传入的参数,自动选择合适数据类型。

另外,本类也提供了如下三个函数让你设置属性,参数的类型和返回函数类似。

+void SetAttribute( const std::string& name, const std::string& _value );

+void SetAttribute( const std::string& name, int _value );

+void SetDoubleAttribute( const char * name, double value );

FirstAttribute和LastAttribute可以让你返回第一个和最后一个属性,它们的函数声明如下:

+TiXmlAttribute* FirstAttribute()

+TiXmlAttribute* LastAttribute()

RemoveAttribute函数可以让你删除指定名称的属性,它的函数声明如下:

+void RemoveAttribute( const std::string& name )

元素函数总结

 

ValueStr //返回元素名称

SetValue //设置元素名称

Parent //返回父节点对象

FirstChild //返回第一个子节点

LastChild //返回最后一个子节点

IterateChildren //返回下一个子节点

InsertEndChild //在最后一个子节点后插入子节点

InsertBeforeChild //在指定的子节点前插入子节点

InsertAfterChild //在指定的子节点后插入子节点

ReplaceChild //替换指定的子节点

RemoveChild //删除指定的子节点

Clear //删除所有的子节点

PreviousSibling //返回同级中前一个节点

NextSibling //返回同级中后一个节点

NextSiblingElement //返回同级中后一个元素

FirstChildElement //返回第一个子元素节点

Attribute //返回元素中的属性值

QueryValueAttribute //返回元素中的属性值

SetAttribute //设置元素中的属性值

FirstAttribute //返回元素中第一个属性对象

LastAttribute //返回元素中最后一个属性对象

RemoveAttribute //删除元素中指定的属性对象

属性类

 

属性为名称="值"对,元素可以具有属性值,但名称必须唯一。

你可以通过

+const std::string& NameTStr() const

返回属性名称

也可以通过下面三个函数返回属性值:

+const std::string& ValueStr() const

+int IntValue() const;

+double DoubleValue() const;

当然你也可以设置属性值,它们的函数声明如下:

+void SetName( const std::string& _name )

+void SetIntValue( int _value );

+void SetDoubleValue( double _value );

+void SetValue( const std::string& _value )

以上函数与元素类中的相关函数类似,这里不重复介绍了。

在元素属性中,通常具有许多属性,你可以通过Next函数返回下一个属性对象的指针,也可以通过Previous函数获得上一个属性对象的指针。它们的函数声明如下:

+TiXmlAttribute* Next()

+TiXmlAttribute* Previous()

 

TinyXml使用文档对象模型(DOM)来解析xml文件,这种模型的处理方式为在分析时,一次性的将整个XML文档进行分析,并在内存中形成对应的树结构,同时,向用户提供一系列的接口来访问和编辑该树结构。这种方式占用内存大,但可以给用户提供一个面向对象的访问接口,对用户更为友好,非常方便用户使用。下面我们依次来介绍各个类的用法。

文档类

 

 

 

文档类代表一个XML文档,通过它,你可以保存,载入和打印输出文档。你可以通过以下方式载入xml文档到TiXmlDocument。

创建文档对象

 

l 创建一个空的文档对象,然后载入一个xml文档

使用到的函数原形如下:

+TiXmlDocument();

+bool LoadFile( const std::string& filename)

在程序中你可以如下使用:

 

//载入xml文档

TiXmlDocument doc();

doc.LoadFile("tutorial.xml");

l 2、在构造函数中传入文档的名称,然后调用load函数完成解析载入

使用到的函数原形如下:

+TiXmlDocument( const std::string& documentName );

+bool LoadFile();

在程序中你可以如下使用:

 

//载入xml文档

TiXmlDocument doc("tutorial.xml");

doc.LoadFile();

输出文档对象

 

文档类提供了Print()函数用于在控制台输出当前的文档内容,这个函数的原形如下:

+void Print() const

在程序中你可以如下使用:

 

//载入xml文档

TiXmlDocument doc("tutorial.xml");

doc.LoadFile();

doc.Print(); //输出文档

tutorial.xml的内容如下:

 

<?xml version="1.0" standalone="yes" encoding="utf-8"?>

<!--comment 注释-->

<element attribute="this a attribute(这是一个属性)" int= "1" float = "3.14">

<subelement1>

This a text(这是一个文本)

</subelement1>

<subelement2/>

<subelement3/>

<subelement4/>

</element>

在控制台中你可以得到如下输出:

由于文件使用UTF-8编码,而Windows下的控制台默认使用gb2312编码,因此会生成乱码。

Tinyxml2学习的更多相关文章

  1. 值得学习的C语言开源项目

    值得学习的C语言开源项目   - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工 ...

  2. 值得学习的C/C++开源框架(转)

    值得学习的C语言开源项目 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的 ...

  3. TinyXML2的使用

    -----------------------------------------------------------------2015年7月21日16:37:53----------------- ...

  4. C++的一些不错开源框架,可以学习和借鉴

    from https://www.cnblogs.com/charlesblc/p/5703557.html [本文系外部转贴,原文地址:http://coolshell.info/c/c++/201 ...

  5. 【C/C++开发】值得学习的C语言开源项目

    值得学习的C语言开源项目 - 1. Webbench Webbench是一个在Linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的 ...

  6. 值得学习的C语言开源项目和库

    收集一些C/C++相关的源码,如有更高效的库,请提醒我 补充上去 C/C++相关交流Q群 1414577 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具. ...

  7. 值得学习的C/C++开源项目 持续更新

    值得学习的C语言开源项目 持续更新 文章目录 值得学习的C语言开源项目 持续更新 - 1. Webbench - 2. Tinyhttpd - 3. cJSON - 4. CMockery - 5. ...

  8. 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代

    2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...

  9. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

随机推荐

  1. Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method fail

    SpringBoot 单元测试报错 @RunWith(SpringRunner.class) @SpringBootTest public class ProductCategoryRepositor ...

  2. Restful传递数组参数的两种方式

    第一种,直接传递数组 js直接传递数组 var data = ["123","456"];that.loadDictionarys(data).subscrib ...

  3. Android音乐、视频类APP常用控件:DraggablePanel(2)

     Android音乐.视频类APP常用控件:DraggablePanel(2) 附录文章1主要演示了如何使用DraggablePanel 的DraggableView.DraggablePanel ...

  4. oracle latch

    (转载 : http://www.dbtan.com/2010/05/latch-free.html) Latch Free(闩锁释放):Latch Free通常被称为闩锁释放,这个名称常常引起误解, ...

  5. natural join 以及 v$statname , v$sessstat

    oracle natural join是一个比较方便的用法.如果两个表的某些字段名称相同,类型相同,natural join就会把他们做等值连接.比如下面我们知道这两个视图的结构如下: SQL> ...

  6. Clojure:ZeroMQ的入门DEMO

    假设你已经知道什么是ZeroMQ(不知道的话可以看这个:http://zh.wikipedia.org/wiki/%C3%98MQ),以下就给出在Clojure中如何使用ZeroMQ(感谢此文作者:h ...

  7. 解释为什么word2vec也被称作deep learning

    作者:orangeprince链接:https://www.zhihu.com/question/27689129/answer/39117725来源:知乎著作权归作者所有.商业转载请联系作者获得授权 ...

  8. acdream 1414 Geometry Problem

    Geometry Problem Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)    ...

  9. axis2的wsdl无法使用eclipse axis1插件来生成client--解决方法

    使用jetty+axis2实现webservice服务端,且无需使用axis2命令生成服务端代码.仅仅要services.xml配置实现类. project为gradleproject配置文件在src ...

  10. autofac的小知识点

    autofac 注入中i遇到的泛型传参问题 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ...