TiXml使用详解

转自:http://blog.csdn.net/appletreesujie/article/details/4207435


     本文用一个详细的例子说明了TiXml的使用方法。如写、查找、插入、替换、加载、遍历等常见操作。

     首先简单介绍一下TinyXml,要看详细的在网上搜搜了^_^:

1、TinyXml源代码只有4个cpp文件和2个头文件。

2、首先要理解TinyXml中的各个基本类型之间的关系,看看这个继承图大家就会很明白了!

     可以看到TinyXml中的注释comment ,声明declaration,元素element,文本等都是节点Node的子类,也就是说可以把XMl文件中的各个元素当做节点来处理。Node类型也有到各个子类之间的转换方法,如ToElement()转换成元素,ToDocument转换成文档等。

    因此可以吧TiXmlNode作为TinyXml的基本数据类型来操作,这样转化到其他类型也比较方便!

3、Document就是整个Xml文档,Comment就是里面的注释,原始类似于HTML中的tag。

  如<element/>就是一个空元素。

  如 <ele attr1="hello" attr2="world">你好</ele>,其中attr1 arrt2就是ele元素的属性,"hello" 和"world"分别是相应属性的值,最后字符串“你好”就是此节点的一个文本text。

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、TinyXml中Node的类型types是一个枚举类型,其成员如下:

DOCUMENT, ELEMENT, COMMENT, UNKNOWN, TEXT, and DECLARATION
<pre class="fragment" name="code" style="white-space: pre-wrap; word-wrap: break-word; background-color: rgb(255, 255, 255);">7、TinyXml的在线文档和主页:
http://www.grinninglizard.com/tinyxmldocs/index.html
8、常用操作详解:
 

 
[cpp]  view plain copy
  1. glibc[~]# cat example.cc   
  2. #include "tinyxml.h"  
  3. #include <iostream>  
  4. using namespace std;  
  5.   
  6. TiXmlDocument *pDoc =NULL;  
  7. void write_xml( )/*写XMl文档的函数*/  
  8.     {  
  9.   
  10.         TiXmlDocument doc;  
  11.         TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0""""" );  
  12.         doc.LinkEndChild( decl );  
  13.   
  14.         TiXmlElement * element1 = new TiXmlElement( "AMULE_ToDL" );//创建元素element1  
  15.         element1->SetAttribute("num",5);  
  16.         doc.LinkEndChild( element1 );  
  17. //      TiXmlText * text = new TiXmlText( "World" );//创建一个文本  
  18. //      element->LinkEndChild( text );//链接  
  19.   
  20.   
  21.         TiXmlElement * element11 = new TiXmlElement( "name" );  
  22.         element11->SetAttribute("name","GongFong.rmvb");  
  23.         element1->LinkEndChild( element11 );//链接element11为element1的子节点(子元素)  
  24.   
  25.         TiXmlElement * element2 = new TiXmlElement( "BT_ToDL" );  
  26.         element2->SetAttribute("num",10);//创建属性  
  27.         doc.LinkEndChild(element2);  
  28.     //dump_to_stdout(&doc);  
  29.         doc.SaveFile( "1.xml" );  
  30. }  
  31.   
  32.   
  33. void dump_to_stdout( TiXmlNode* pParent )//Tixml主页上给的一个遍历方法  
  34. {  
  35.         if ( !pParent ) return;  
  36.   
  37.         TiXmlNode* pChild;  
  38.         TiXmlText* pText;  
  39.         int t = pParent->Type();  
  40.         printf( "type %d/n", t);  
  41.         int num;  
  42.   
  43.         switch ( t )  
  44.         {  
  45.         case TiXmlNode::DOCUMENT:  
  46.                printf( "Document" );  
  47.                 break;  
  48.   
  49.         case TiXmlNode::ELEMENT:  
  50.                 printf( "Element [%s]", pParent->Value() );  
  51.                num=dump_attribs_to_stdout(pParent->ToElement(), indent+1);  
  52.                 switch(num)  
  53.                 {  
  54.                         case 0:  printf( " (No attributes)"); break;  
  55.                         case 1:  printf( "%s1 attribute", getIndentAlt(indent)); break;  
  56.                         default: printf( "%s%d attributes", getIndentAlt(indent), num); break;  
  57.                 }  
  58.                 break;  
  59.   
  60.         case TiXmlNode::COMMENT:  
  61.                printf( "Comment: [%s]", pParent->Value());  
  62.                 break;  
  63.   
  64.         case TiXmlNode::UNKNOWN:  
  65.                 printf( "Unknown" );  
  66.                 break;  
  67.   
  68.         case TiXmlNode::TEXT:  
  69.                pText = pParent->ToText();  
  70.                 printf( "Text: [%s]", pText->Value() );  
  71.                 break;  
  72.   
  73.         case TiXmlNode::DECLARATION:  
  74.                 printf( "Declaration" );  
  75.                 break;  
  76.         default:  
  77.                 break;  
  78.         }  
  79.         printf( "/n" );  
  80.         for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling())   
  81.         {  
  82.                 dump_to_stdout( pChild );  
  83.         }  
  84. }  
  85. void search(TiXmlNode* pParent)//遍历时候,把每个节点都是做一个父节点,即假定其都有子节点ChildNode  
  86. {  
  87.        if ( !pParent ) return;  
  88.          
  89.        TiXmlNode* pChild= NULL;  
  90.            int t = pParent->Type();//获取此节点的类型  
  91.   
  92.        if (TiXmlNode::ELEMENT == t && (strcmp("Welcome",pParent->Value()) == 0))//搜索元素值为"Welcome"的  
  93.         {  
  94.            printf("value %s/n",pParent->Value());//打印值  
  95.            pParent->SetValue("re-write");//改变其属性  
  96.            pParent->ToElement()->SetAttribute("hello",20);  
  97.   
  98.            TiXmlElement * element1 = new TiXmlElement( "AMULE_ToDL" );//添加一个节点  
  99.                element1->SetAttribute("num",5);  
  100.                pParent->LinkEndChild(element1);  
  101.   
  102.            pDoc->SaveFile(); //保存文件                
  103.         }  
  104.     printf( "/n" );  
  105.     for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling())   
  106.         {  
  107.             search(pChild);  
  108.     }  
  109.         
  110. }  
  111. void search2(TiXmlNode* pParent)//另一种方法:  
  112. {  
  113.        if ( !pParent ) return;  
  114.          
  115.        TiXmlNode* pChild= NULL;  
  116.        TiXmlNode*tmp = NULL;  
  117.            int t = pParent->Type();  
  118.   
  119.        tmp = pParent->FirstChild("Window");//搜索元素值为"Window"的节点  
  120.        if(tmp){  
  121.           
  122.       //pParent->RemoveChild(tmp);//找到后删除此节点  
  123.               
  124.        TiXmlElement * element1 = new TiXmlElement( "AMULE_ToDL" );  
  125.            element1->SetAttribute("num",5);  
  126.   
  127.        pParent->ReplaceChild(tmp,*element1);//找到"AMULE_ToDL"节点后替换此节点  
  128.          
  129.        }  
  130.   
  131.        pDoc->SaveFile(); //保存文件                 
  132.           
  133.     printf( "/n" );  
  134.     for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling()) //遍历一个节点的所兄弟节点,记着单词sibling是兄弟, 姐妹的意思  
  135.                                                                                                                                 //也就是说FirstChild()和NextSibling()不是 父节点和子节点的关系  
  136.     {  
  137.             search2(pChild);//遍历一个节点的所有子节点  
  138.     }  
  139.         
  140. }  
  141. int main(int argc, char* argv[])  
  142.    {  
  143.   
  144.         TiXmlDocument doc(argv[1]);  
  145.         bool loadOkay = doc.LoadFile();  
  146.         if (loadOkay)  
  147.         {  
  148.             pDoc = &doc;  
  149.                 printf("/n%s:/n", argv[1]);  
  150.                 //dump_to_stdout( &doc ); // defined later in the tutorial  
  151.                 search2(&doc);                //把TiXmlDocument类型的值复制给一个TiXmlNode类型  
  152.         }  
  153.         else  
  154.         {  
  155.                 printf("Failed to load file /"%s/"/n", argv[1]);  
  156.         }  
  157.     
  158.      return 0;  
  159.    }  
  160.   
  161. /*void dump_to_stdout1(const char* pFilename) 
  162. { 
  163.         TiXmlDocument doc(pFilename); 
  164.         bool loadOkay = doc.LoadFile(); 
  165.         if (loadOkay) 
  166.         { 
  167.                 printf("/n%s:/n", pFilename); 
  168.                 dump_to_stdout( &doc ); // defined later in the tutorial 
  169.         } 
  170.         else 
  171.         { 
  172.                 printf("Failed to load file /"%s/"/n", pFilename); 
  173.         } 
  174.  
  175. int main(int argc, char* argv[]) 
  176. { 
  177.         for (int i=1; i<argc; i++) 
  178.         { 
  179.                 dump_to_stdout1(argv[i]); 
  180.         } 
  181.         return 0; 
  182. }*/  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值