TinyXml使用方法

本文用一个详细的例子说明了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。

  如就是一个空元素。

  如 你好,其中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
7、TinyXml的在线文档和主页:
http://www.grinninglizard.com/tinyxmldocs/index.html
8、常用操作详解:
  1. glibc[~]# cat example.cc   
  2. #include "tinyxml.h"  
  3. #include   
  4. using namespace std;  
  5.   
  6. TiXmlDocument *pDoc =NULL;  
  7. void write_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 pParent->Type();  
  40.         printf( "type %d/n", t);  
  41.         int num;  
  42.   
  43.         switch  
  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 pParent->Type();//获取此节点的类型  
  91.   
  92.        if (TiXmlNode::ELEMENT == && (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 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.  


http://blog.sina.com.cn/s/blog_472a9f0c01018mui.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值