全面的总结一下TinyXML操作XML文件的过程,TinyXML中的类与XML文件结构成一一对应关系。
Lxr
2013-09-12
[1]为XML文件声明,指明XML的版本为1.0,支持gb2312(可在XML中写中文),独立格式。声明主要是用来表面当前XML文件所遵循的XML标准。
[2]为XML的第一个根元素起始标记,与声明处于同一层次。在此XML文件中,其余元素都是[2]
[5]为XML注释的写法:注释内容->
[6]、[14]、[24]为以
[7] ~[9]为以
元素之间可以多层嵌套,在内存的元素为外层元素的子元素。
元素时构成XML文件的主要内容,用TinyXML读取XML文件时主要是对各元素的嵌套关系和对元素结构的读取。捡以上XML文件[16]元素来说明它具有的如下结构。
|
name="i" address="0" value="10"> |
Text |
|
元素起始标记名 |
起始标记属性 |
文本 |
元素结束标记名 |
文本部分在以上的XML中没有书写。属性、文本都是可以缺省的。
在TinyXML眼里,对于已经存在的一个XML文件(TinyXMLY也可以创建任意内容的XML文件),可以分为5种情况来描述完对XML文件的读取。
对于,TinyXML,对应XML整个文件的类为TiXmlDocument。
TiXmlDocument *pXmlDoc = NULL; pXmlDoc = new TiXmlDocument(); if( !pXmlDoc ) { return false; } //加载目标XML文件 pXmlDoc->LoadFile( filename ); …… if( pXmlDoc ) { delete pXmlDoc; } |
对于以上XML文件,LoadFile方法载入已经存在的XML文件,同时这段代码也展示了使用new-delete的基本方法。
对于XML元素来说,TinyXML对其操作的类为TiXmlElement。
TiXmlElement *pRootElement; pRootElement = pXmlDoc->RootElement(); if ( !pRootElement ) { return false; } |
对于以上XML文件,如果操作成功,则pRootElement指向根元素以起始标记为
TiXmlElement *pRootChild; pRootChild = pRootElement->FirstChildElement(); if( ! pRootChild ) { return false; } |
用指向当前元素的指针使用方法FirstChildElement();就可以获取当前元素下的子元素。对于以上XML文件,若方法操作成功,则pRootChild指向以
pRootChild = pRootChild-> NextSiblingElement(); |
使用NextSiblingElement();方法就可以获取跟pRootChild处于同层次下的下一个元素。对于以上XML文件,若此方法操作成功,则此时pRootChild指向以起始标记为
以以下XML元素为例:
|
name="i" address="0" value="10"> |
Text |
|
元素起始标记名 |
起始标记属性 |
文本 |
元素结束标记名 |
如在以上XML文件中,此元素对于根元素来说处于XML文本中的第三层子元素。假设元素指针pRootCCChild指向这一个元素
用指向当前元素的指针使用Value();方法即可访问。如pRootCCChild->Value();代表值”var”。
对于TinyXML,操作XML中元素的属性用TiXmlAttribute类。
TiXmlAttribute *pAttribute; //取当前行的第一个属性 pAttribute = XmlCurrentLine->FirstAttribute(); if ( !pAttribute ) { //… } … //获取此元素的下一个属性 pAttribute = pAttribute->Next(); |
操作元素文本的TinyXML类是TiXmlElement。利用方法GetText()即可获得文本内容。
就这样就可以清晰地读出一个文件了。可以针对性的编写一个读XML文件一行的函数(因为所有的XML文件的每一行都可以看成为“起始标记、属性、文本、结束标记”组成的)。也可以针对同一层元素写一个遍历函数(只需在操作过后使用Next*)。
函数都有特殊用途,特殊用途部分可不参考。
可灵活扩展,将Text也读出来。
对于函数的参数函数的具体内容皆可不参考。