TinyXML入门教程

news/2024/7/3 12:28:46 标签: string, 文档, xml, encoding, float, 语言

TinyXML入门教程

文章分类:C++ 编程

TinyXML 入门教程
什么是XML 1
文档 2
创建文档对象 3
输出文档对象 3
保存文档对象 4
返回第一个根元素 5
声明类 5
注释类 6
元素类 6
节点名 6
父节点 6
子节点 7
编辑子节点 7
同级节点 7
遍历元素 8
元素属性 8
元素函数总结 9
属性类 10

 

文章下载

源代码下载

什么是 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
:文本对象,它嵌套在某个元素内部,如上图所示。

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 编码,因此会生成乱码。

 

保存文档对象

当然你也可以使用 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()

 


http://www.niftyadmin.cn/n/1310436.html

相关文章

vivi开发笔记【专辑】

vivi开发笔记【专辑】 http://blogold.chinaunix.net/u/21948/showart_344254.html转载于:https://www.cnblogs.com/hnrainll/archive/2011/04/11/2012525.html

OnEraseBkGnd()

在OnEraseBkGnd中,如果你不调用原来缺省的OnEraseBkGnd只是重画背景则不会有闪烁.而在OnPaint里面,由于它隐含的调用了OnEraseBkGnd,而你又没有处理OnEraseBkGnd函数,这时就和窗口缺省的背景刷相关了.缺省的OnEraseBkGnd操作使用窗口的缺省背景刷刷新背景(一般情况下是白刷),而…

C51中的INTRINS.H:内部函数

C51中的INTRINS.H&#xff1a;内部函数 2007年05月14日 星期一 17:02INTRINS.H&#xff1a;内部函数 函数名&#xff1a; _crol_&#xff0c;_irol_&#xff0c;_lrol_ 原 型&#xff1a; unsigned char _crol_(unsigned char val,unsigned char n); unsigned int _irol_(unsig…

python学习手册笔记——38.装饰器

00.装饰是未函数和类指定管理代码的一种方式。装饰器本身的形式是处理其他的可调用对象的可调用的对象。*函数装饰器在函数定义的时候进行名称重绑定&#xff0c;提供一个逻辑层来管理函数和方法或随后对它们的调用。*类装饰器在类定义的时候进行名称重绑定&#xff0c;提供一个…

PCA-SIFT GLOH

SIFT 后来有两种扩展&#xff0c;都用到PCA的概念。1 PCA-SIFT PCA-SIFT与标准SIFT有相同的亚像素位置&#xff08;sub-pixel &#xff09;&#xff0c;尺度&#xff08;scale&#xff09;和主方向&#xff08;dominant orientations&#xff09;&#xff0c;但在第4步计算描…

art-template 模版引擎

模版引擎是第三方模块 可以让开发着以更友好的方式拼接字符串&#xff0c;使项目代码更加清晰&#xff0c;更加易于维护。 art-template 模版引擎 使用命令行工具 输入 npm i art-template 进行安装使用const template require(art-template) 引入模版引擎 告诉模版引擎要拼接…

房贷计算器——新增选择还款方式

房贷计算器——新增选择还款方式 #!/usr/bin/env python # coding: utf-8# In[4]: 文字‘房贷计算器’ 文字‘贷款总金额’&#xff1a;输入框 文字‘贷款期限’&#xff1a;输入框 文字‘年利率’&#xff1a;输入框 按钮‘开始计算’ 返回&#xff1a; 月供 总利息 from tki…

去除jquery.min.map 404错误信息

调试中出现了 jquery.min.map 404 (Not Found) 的js错误信息&#xff1b; 那么jquery.min.map到底是个什么呢&#xff1f; JQuery 官方解释 从 jQuery 1.9.0 版本后在原始代码里会有 sourceMappingURLjquery.min.map 什么是Source map 简单说&#xff0c;Source map就是一个信息…