《TiXml使用详解》由会员分享,可在线阅读,更多相关《TiXml使用详解(8页珍藏版)》请在金锄头文库上搜索。
1、TiXml 使用详解 ( 转) 2011-09-06 17:03 本文用一个详细的例子说明了TiXml 的使用方法。如写、查找、插入、替换、加载、遍历等常见操作。首先简单介绍一下TinyXml ,要看详细的在网上搜搜了_: TinyXML 是一个简单小巧,可以很容易集成到其它程序中的C+ XML解析器。简单地说,TinyXML 解析一个XML文档并由此生成一个可读可修改可保存的文档对象模型(DOM )。TinyXML 使用文档对象模型(DOM ),这意味着XML数据被解析成一个可被浏览和操作的C+对象,然后它可以被写到磁盘或者另一个输出流中。你也可以把C+ 对象构造成一个XML文档然后把它写到
2、磁盘或者另一个输出流中。1、TinyXml 源代码只有4 个 cpp 文件和 2 个头文件。2、首先要理解TinyXml 中的各个基本类型之间的关系,看看这个继承图大家就会很明白了!可以看到TinyXml 中的注释 comment ,声明 declaration,元素 element ,文本等都是节点Node的子类,也就是说可以把XMl 文件中的各个元素当做节点来处理。Node类型也有到各个子类之间的转换方法,如ToElement ()转换成元素,ToDocument转换成文档等。因此可以吧TiXmlNode 作为 TinyXml 的基本数据类型来操作,这样转化到其他类型也比较方便!3、类之间
3、的关系TinyXml 实现的是DOM 访问模型,因此提供了一系列的类对应XML文件中的各个节点。主要类间的关系如下:TiXmlBase:其他类的基类,是个抽象类TiXmlNode:表示一个节点,包含节点的一般方法,如访问子节点、兄弟节点、编辑自身、编辑子节点TiXmlDocument :表示整个XML文档,不对应其中某个特定的节点。TiXmlElement :表示元素节点,可以包含子节点和TiXmlAttribute TiXmlComment:表示注释TiXmlDeclaration:表示声明TiXmlText :表示文本节点TiXmlUnknown:表示未知节点,通常是出错了TiXmlAtt
4、ribute:表示一个元素的属性下面是一个简单的例子:TinyXml How To 20Some words,整个文档,对应TiXmlDocument book,name,price, description,都对应TiXmlElement 第一行对应一个TiXmlDeclaration 第二行对应一个TiXmlComment “TinyXml How To”对应一个TiXmlText unit则是 price的一个 TiXmlAttribute 这些类与XML文件中的相应元素都有很好的对应关系,因此相信参照TinyXml 的文档, 可以很容易的掌握各个方法的使用。2. 需要注意的问题各类之间
5、的转换由于各个节点类都从TiXmlNode 继承,在使用时常常需要将TiXmlNode* 类型的指针转换为其派生类的指针, 在进行这种转换时, 应该首先使用由TiXmlNode 类提供的一系列转换函数,如 ToElement(void),而不是c+的 dynamic_cast 。检查返回值由于 TinyXml 是一个非校验的解析器,因此当解析一个文件时,很可能文件并不包含我们预期的某个节点,在这种情况下,TinyXml 将返回空指针。因此,必须要对返回值进行检查,否则将很容易出现内存访问的错误。如何重头建立一个XML文件先建立一个TiXmlDocument 对象,然后,载入某个模板, 或者直接
6、插入一个节点作为根节点,接着就可以像打开一个已有的XML文件那样对它进行操作了。4、要理解TinyXml 中的每个节点都可能是另一个节点的父节点这个很重要,因此遍历TinyXml 文档要用递归的方法。每个节点都可能有属性,文本什么的!5、每个 type of TiXmlNode节点的值 value对应如下:Document: filename of the xml file Element: name of the element Comment: the comment text Unknown: the tag contents Text: the text string 6、TinyXm
7、l 中 Node的类型 types 是一个枚举类型,其成员如下:DOCUMENT, ELEMENT, COMMENT, UNKNOWN, TEXT, and DECLARATION 7、TinyXml 的在线文档和主页:http:/ 8、常用操作详解:#include “tinyxml.h“ #include using namespace std; TiXmlDocument *pDoc =NULL; void write_xml( ) TiXmlDocument doc; TiXmlDeclaration * decl = new TiXmlDeclaration( “1.0“, “, “
8、 ); doc.LinkEndChild( decl ); TiXmlElement * element1 = new TiXmlElement( “AMULE_ToDL“ );/创建元素element1 element1-SetAttribute(“num“,5); doc.LinkEndChild( element1 ); TiXmlElement * element11 = new TiXmlElement( “name“ ); element11-SetAttribute(“name“,“GongFong.rmvb“);/创建属性element1-LinkEndChild( eleme
9、nt11 );/链接 element11 为 element1 的子节点(子元素)TiXmlElement * element2 = new TiXmlElement( “BT_ToDL“ ); element2-SetAttribute(“num“,10); doc.LinkEndChild(element2); doc.SaveFile( “1.xml“ ); void dump_to_stdout( TiXmlNode* pParent )/Tixml主页上给的一个遍历方法( 递归调用 ) if ( !pParent ) return; TiXmlNode* pChild; TiXmlT
10、ext* pText; int t = pParent-Type(); printf( “type %d/n“, t); int num; switch ( t ) case TiXmlNode:DOCUMENT: printf( “Document“ ); break; case TiXmlNode:ELEMENT: printf( “Element %s“, pParent-Value() ); num=dump_attribs_to_stdout(pParent-ToElement(), indent+1); switch(num) case 0: printf( “ (No attri
11、butes)“); break; case 1: printf( “%s1 attribute“, getIndentAlt(indent); break; default: printf( “%s%d attributes“, getIndentAlt(indent), num); break; break; case TiXmlNode:COMMENT: printf( “Comment: %s“, pParent-Value(); break; case TiXmlNode:UNKNOWN: printf( “Unknown“ ); break; case TiXmlNode:TEXT:
12、 pText = pParent-ToText(); printf( “Text: %s“, pText-Value() ); break; case TiXmlNode:DECLARATION: printf( “Declaration“ ); break; default: break; printf( “/n“ ); for ( pChild = pParent-FirstChild(); pChild != 0; pChild = pChild-NextSibling() dump_to_stdout( pChild ); void search(TiXmlNode* pParent)
13、/遍历时候,把每个节点都是做一个父节点,即假定其都有子节点ChildNode if ( !pParent ) return; TiXmlNode* pChild= NULL; int t = pParent-Type();/获取此节点的类型if (TiXmlNode:ELEMENT = t /打印值pParent-SetValue(“re-write“);/改变其值pParent-ToElement()-SetAttribute(“hello“,20);/设置其属性TiXmlElement * element1 = new TiXmlElement( “AMULE_ToDL“ );/添加一个节
14、点element1-SetAttribute(“num“,5); pParent-LinkEndChild(element1); pDoc-SaveFile(); /保存文件 printf( “/n“ ); for ( pChild = pParent-FirstChild(); pChild != 0; pChild = pChild-NextSibling() search(pChild); int main(int argc, char* argv) TiXmlDocument doc(argv1); bool loadOkay = doc.LoadFile(); if (loadOka
15、y) pDoc = printf(“/n%s:/n“, argv1); search( /把 TiXmlDocument 类型的值复制给一个TiXmlNode 类型 else printf(“Failed to load file /“%s/“/n“, argv1); return 0; 9、引例#include#include“tinyxml.h“#include“tinystr.h“#include#include#includeusingnamespacestd ;CString GetAppPath() / 获取应用程序根目录TCHAR modulePath MAX_PATH;GetM
16、oduleFileName( NULL, modulePath, MAX_PATH );CString strModulePath( modulePath);strModulePath =strModulePath. Left( strModulePath. ReverseFind( _T ( );return strModulePath;bool CreateXmlFile( string/ 创建一个根元素并连接。TiXmlElement * RootElement =new TiXmlElement( “Persons“);myDocument- LinkEndChild( RootEle