源代码下载:http://sourceforge.net/projects/tinyxml/files/
如下是一个XML片段:
<Persons>
<PersonID="1">
<name>周星星</name>
<age>20</age>
</Person>
<PersonID="2">
<name>白晶晶</name>
<age>18</age>
</Person>
</Persons>
在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的一些操作。
那我们如何使用这些类以及他们的
方法来操纵我们的XML呢?请看下面。
一、读取XML(假设我们的Xml文档中的
内容与上面的Xml
内容一样)
//
创建一个XML的文档对象。
TiXmlDocument*myDocument=
newTiXmlDocument("填上你的Xml
文件名");
myDocument->LoadFile();
//
获得根元素,即Persons。
TiXmlElement*RootElement=myDocument.RootElement();
//
输出根元素名称,即输出Persons。
cout<<RootElement->Value()<<endl;
//
获得第一个Person节点。
TiXmlElement*FirstPerson=RootElement->FirstChildElement();
//
获得第一个Person的name节点和age节点和ID属性。
TiXmlElement*NameElement=FirstPerson->FirstChildElement();
TiXmlElement*AgeElement=NameElement->NextSiblingElement();
TiXmlAttribute*IDAttribute=FirstPerson->FirstAttribute();
//
输出第一个Person的name内容,即周星星;age内容,即20;ID属性,即1。
cout<<NameElement->FirstChild()->Value<<endl;
cout<<AgeElement->FirstChild()->Value<<endl;
cout<<IDAttribute->Value()<<endl;
看,读取XML是不是很简单阿,和Java的XML解析库非常的相似,就是名字改了一下而已。
二、
生成XML
内容
//
创建一个XML的文档对象。
TiXmlDocument*myDocument=
newTiXmlDocument();
//
创建一个根元素并连接。
TiXmlElement*RootElement=
newTiXmlElement("Persons");
myDocument->LinkEndChild(RootElement);
//
创建一个Person元素并连接。
TiXmlElement*PersonElement=
newTiXmlElement("Person");
RootElement->LinkEndChild(PersonElement);
//
设置Person元素的属性。
PersonElement->SetAttribute("ID","1");
//
创建name元素、age元素并连接。
TiXmlElement*NameElement=
newTiXmlElement("name");
TiXmlElement*AgeElement=
newTiXmlElement("age");
PersonElement->LinkEndChild(NameElement);
PersonElement->LinkEndChild(AgeElement);
//
设置name元素和age元素的内容并连接。
TiXmlText*NameContent=
newTiXmlText("周星星");
TiXmlText*AgeContent=
newTiXmlText("20");
NameElement->LinkEndChild(NameContent);
AgeElement->LinkEndChild(AgeContent);
//
保存到文件
myDocument->SaveFile("要保存的xml
文件名");
这样,便创建了一个如下的xml
文件:
<Persons>
<PersonID="1">
<name>周星星</name>
<age>20</age>
</Person>
</Persons>
TinyXML入门教程
TinyXML入门教程1
什么是XML?1
文档类2
创建文档对象3
输出文档对象3
保存文档对象4
返回第一个根元素5
声明类5
注释类6
元素类6
节点名6
父节点6
子节点7
编辑子节点7
同级节点7
遍历元素8
元素
属性8
元素
函数总结9
属性类10
什么是XML?
XML全称EXtensibleMarkupLanguage,翻译为可扩展
标记语言,简而言之就是你可以
自定义数据的标识,以此来区分各种不同的数据,以便于进行数据交换,例如html就可以理解为一种简单的xml语言。XML
文件通常就是一个文本
文件,可以使用任何编码
上图就是我系统中一个xml
文件的图标,使用VC2005打开它,你可以看到如下
内容:
XML也是有这几个对象组成了,一般来说我们经常使用的类如下:
lTiXmlDocument:文档类,它代表了整个xml
文件。
lTiXmlDeclaration:声明类,它表示
文件的声明部分,如上图所示。
lTiXmlComment:注释类,它表示
文件的注释部分,如上图所示。
lTiXmlElement:元素类,它是
文件的主要部分,并且
支持嵌套结构,一般使用这种结构来
分类的存储信息,它可以包含
属性类和文本类,如上图所示。
nTiXmlAttribute/TiXmlAttributeSet:元素
属性,它一般嵌套在元素中,用于记录此元素的一些
属性,如上图所示。
nTiXmlText:文本对象,它嵌套在某个元素内部,如上图所示。
TinyXml使用文档对象模型(DOM)来解析xml
文件,这种模型的处理方式为在分析时,一次性的将整个XML文档进行分析,并在内存中形成对应的树结构,同时,向
用户提供一系列的接口来访问和编辑该树结构。这种方式占用内存大,但可以给
用户提供一个面向对象的访问接口,对
用户更为友好,非常方便
用户使用。下面我们依次来介绍各个类的
用法。
文档类
文档类代表一个XML文档,通过它,你可以保存,载入和打印
输出文档。你可以通过以下方式载入xml文档到TiXmlDocument。
创建文档对象
l创建一个空的文档对象,然后载入一个xml文档
使用到的
函数原形如下:
+TiXmlDocument();
+
bool
LoadFile(
const
std::
string
&filename)
在程序中你可以如下使用:
//
载入xml文档
TiXmlDocumentdoc();
doc.LoadFile("tutorial.xml");
l2、在构造
函数中传入文档的
名称,然后
调用load
函数完成解析载入
+TiXmlDocument(
&documentName);
LoadFile();
TiXmlDocumentdoc("tutorial.xml");
doc.LoadFile();
输出文档对象
文档类提供了Print()
函数用于在控制台
输出当前的文档
内容,这个
函数的原形如下:
void
Print()
const
doc.Print();
输出文档
tutorial.xml的内容如下:
<?xmlversion="1.0"standalone="yes"encoding="utf-8"?>
<!--comment注释-->
<elementattribute="thisaattribute(这是一个
属性)"
int
="1"
float
="3.14">
<subelement1>
Thisatext(这是一个文本)
</subelement1>
<subelement2/>
<subelement3/>
<subelement4/>
</element>
在控制台中你可以得到如下
输出:
由于
文件使用UTF-8编码,而Windows下的控制台默认使用gb2312编码,因此会
生成乱码。
保存文档对象
当然你也可以使用SaveFile()
函数来进行另存为,这个
函数的原形如下:
SaveFile(
&filename)
cout<<endl;
doc.SaveFile("tutorial.txt");
使用记事本打开tutorial.txt,你可以看到如下
内容。
返回第一个根元素
另外文档对象还提供了一个实用的
函数用于返回第一个根对象,它可以让你方便的遍历整个文档结构,查找自己需要的数据。
函数原形如下:
+TiXmlElement*RootElement()
我们在介绍元素类的时候再详细介绍它的使用。
声明类
在标准的XML
文件中,声明为
文件的第一项,例如<?xmlversion="1.0"standalone="yes"?>,声明对象具有三个
属性值,版本,编码和独立
文件声明
一般来说文档的第一行就是声明对象,你可以把文档对象的第一个子节点转换为声明对象。
使用TinyXml的声明对象
TiXmlDeclaration*decl;
decl=doc.FirstChild()->ToDeclaration();
然后就可以使用它的
功能了,它可以让你返回当前的版本,编码等信息,
函数原形如下:
char
*Version()
*Encoding()
*Standalone()
cout<<"使用TinyXml的声明对象(TiXmlDeclaration)"<<endl;
输出声明对象对应的xml
内容
decl->Print(0,4,&str);
cout<<str<<endl;
分别
输出声明对象的
属性
cout<<"版本:"<<decl->Version()<<"是否为对立文件:"<<decl->Standalone()<<"编码方式:"<<decl->Encoding()<<endl;
注释类
这个类一般为xml数据提供解释说明,在程序中一般不使用它,因此,这里就不介绍了。
元素类
元素为一个容器类,它具有元素
名称,并可以包含其它元素,文本,注释和未知节点,这些对象统称为元素的节点,即节点可以为元素、文本、注释和未知节点类型。元素也可以包含任意个数的
属性。
我们还是以如下的XML
代码来说明这个类的
功能。
节点名
在上方元素的
代码中,element为根元素的
名称,你可以通过如下的
函数来设置和返回它。
&ValueStr()
SetValue(
&_value)
父节点
subelement1,subelement2,subelement3,subelement4都是element的子元素,如果当前元素对象的指针指向subelement1,subelement2,subelement3,subelement4,你可以通过Parent()
函数来返回指向element对象的指针,Parent()
函数的声明如下:
+TiXmlNode*Parent()
子节点
通过父节点的指针,你可以遍历所有的子节点。
+TiXmlNode*FirstChild()
+TiXmlNode*FirstChild(
上面两个函数用于返回第一个子节点对象的指针,带参数名的那个函数表示返回第一个名为_value的子节点。
+TiXmlNode*LastChild()
+TiXmlNode*LastChild(
上面的两个函数用于返回最后一个节点对象的指针,带参数名的那个函数表示返回最后一个名为_value的子节点。
你也可以使用IterateChildren()
函数来依次遍历所有的节点,它们的
函数声明如下:
+TiXmlNode*IterateChildren(
TiXmlNode*prevIoUs)
&_value,
带参数名的那个函数表示只遍历同名的节点。
编辑子节点
你可以插入、
删除替换所有的子节点。
+TiXmlNode*InsertEndChild(
TiXmlNode&addThis);
+TiXmlNode*InsertBeforeChild(TiXmlNode*beforeThis,239)">+TiXmlNode*InsertAfterChild(TiXmlNode*afterThis,239)">上面三个
函数用于插入节点,InsertEndChild
函数让你把新节点插入到末尾,InsertBeforeChild和InsertAfterChild
函数允许你在指定的节点位置前后插入节点。
+TiXmlNode*ReplaceChild(TiXmlNode*replaceThis,239)">TiXmlNode&withThis);
ReplaceChild
函数用于替换指定的节点。
RemoveChild(TiXmlNode*removeThis);
RemoveChild
函数让你
删除指定的节点。
Clear();
Clear
函数会
删除本节点的所有子节点(
包括子节点包含的从子节点),但不会
修改本节点。
同级节点
在上面的xml
代码中,subelement1、subelement2、subelement3、subelement4都属于同级节点,我们也提供了相关的
函数用于在这些同级节点中遍历。
+TiXmlNode*Prev
IoUsSibling()
+TiXmlNode*Prev
IoUsSibling(
可以根据当前的节点,返回上一个节点的指针。带参数名的那个函数表示返回上一个名为_value的节点。
当然你也可以根据当前的节点,返回下一个节点的指针。带参数名的那个
函数表示返回下一个名为_value的节点。
+TiXmlNode*NextSibling()
+TiXmlNode*NextSibling(
遍历元素
元素是一种特殊的节点,以’<’为开始字符,后接元素
名称。
函数NextSiblingElement用于返回下一个同级元素,而忽略其它类型的节点。它们的
函数声明如下:
+TiXmlElement*NextSiblingElement()
+TiXmlElement*NextSiblingElement(
带参数名的那个函数表示返回下一个名为_value的同级元素。
本类也提供了相关的
函数,让你返回第一个子元素。
+TiXmlElement*FirstChildElement()
+TiXmlElement*FirstChildElement(
带参数名的那个函数表示返回下一个名为_value的子元素。
元素
属性
属性一般保存在元素中,它们为使用“=”号连接的两个字符串,左边的表示
属性名,等号右边的表示
属性值,通常使用字符串、整数和浮点数等数据类型表示。例如,pi=3.14。
你可以通过如下的
函数,返回
属性值。
*Attribute(
&name)
;
&name,239)">*i)
double
*d)
在上面3个函数中,第一个函数使用字符串保存返回的属性值,第二个函数把属性值转换为整数然后返回,第三个函数把属性值转换为浮点数然后返回。不过,第二、三个函数都会以字符串的形式记录属性值,并作为函数的返回值返回。
另外,你也可以使用模板
函数:
+template<typenameT>
QueryValueAttribute(
来返回特点的属性值,它会根据你传入的参数,自动选择合适数据类型。
另外,本类也提供了如下三个
函数让你设置
属性,参数的类型和返回
函数类似。
SetAttribute(
&_value);
_value);
SetDoubleAttribute(
*name,239)">value);
FirstAttribute和LastAttribute可以让你返回第一个和最后一个
属性,它们的
函数声明如下:
+TiXmlAttribute*FirstAttribute()
+TiXmlAttribute*LastAttribute()
RemoveAttribute
函数可以让你
删除指定
名称的
属性,它的
函数声明如下:
RemoveAttribute(
&name)
元素
函数总结
ValueStr
返回元素名称
SetValue
设置元素名称
Parent
返回父节点对象
FirstChild
返回第一个子节点
LastChild
返回最后一个子节点
IterateChildren
返回下一个子节点
InsertEndChild
在最后一个子节点后插入子节点
InsertBeforeChild
在指定的子节点前插入子节点
InsertAfterChild
在指定的子节点后插入子节点
ReplaceChild
替换指定的子节点
RemoveChild
删除指定的子节点
Clear
删除所有的子节点
PrevIoUsSibling
返回同级中前一个节点
NextSibling
返回同级中后一个节点
NextSiblingElement
返回同级中后一个元素
FirstChildElement
返回第一个子元素节点
Attribute
返回元素中的属性值
QueryValueAttribute
SetAttribute
设置元素中的属性值
FirstAttribute
返回元素中第一个属性对象
LastAttribute
返回元素中最后一个属性对象
RemoveAttribute
删除元素中指定的属性对象
属性类
属性为
名称="值"对,元素可以具有
属性值,但
名称必须唯一。
你可以通过
&NameTStr()
返回属性名称
也可以通过下面三个
函数返回
属性值:
IntValue()
DoubleValue()
当然你也可以设置属性值,它们的函数声明如下:
SetName(
&_name)
SetIntValue(
SetDoubleValue(
以上函数与元素类中的相关函数类似,这里不重复介绍了。
在元素
属性中,通常具有许多
属性,你可以通过Next
函数返回下一个
属性对象的指针,也可以通过Prev
IoUs
函数获得上一个
属性对象的指针。它们的
函数声明如下:
+TiXmlAttribute*Next()
+TiXmlAttribute*Prev
IoUs()