加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

TinyXml使用方法

(2012-11-15 12:50:02)
标签:

杂谈

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

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

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

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

http://p.blog.csdn.net/images/p_blog_csdn_net/appletreesujie/EntryImages/20090521/%E6%9C%AA%E5%91%BD%E5%90%8D.jpg

     可以看到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.                         defaultprintf( "%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, charargv[])  
  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.   
glibc[~]# cat example.cc 
#include "tinyxml.h"
#include 
using namespace std;

TiXmlDocument *pDoc =NULL;
void write_xml( )
    {

        TiXmlDocument doc;
        TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "", "" );
        doc.LinkEndChild( decl );

        TiXmlElement * element1 = new TiXmlElement( "AMULE_ToDL" );//创建元素element1
        element1->SetAttribute("num",5);
        doc.LinkEndChild( element1 );
//      TiXmlText * text = new TiXmlText( "World" );//创建一个文本
//      element->LinkEndChild( text );//链接


        TiXmlElement * element11 = new TiXmlElement( "name" );
        element11->SetAttribute("name","GongFong.rmvb");
        element1->LinkEndChild( element11 );//链接element11为element1的子节点(子元素)

        TiXmlElement * element2 = new TiXmlElement( "BT_ToDL" );
        element2->SetAttribute("num",10);//创建属性
        doc.LinkEndChild(element2);
    //dump_to_stdout(&doc);
        doc.SaveFile( "1.xml" );
}


void dump_to_stdout( TiXmlNode* pParent )//Tixml主页上给的一个遍历方法
{
        if ( !pParent ) return;

        TiXmlNode* pChild;
        TiXmlText* 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 attributes)"); 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:
               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)//遍历时候,把每个节点都是做一个父节点,即假定其都有子节点ChildNode
{
       if ( !pParent ) return;
       
       TiXmlNode* pChild= NULL;
           int t = pParent->Type();//获取此节点的类型

       if (TiXmlNode::ELEMENT == t && (strcmp("Welcome",pParent->Value()) == 0))//搜索元素值为"Welcome"的
        {
           printf("value %s/n",pParent->Value());//打印值
           pParent->SetValue("re-write");//改变其属性
           pParent->ToElement()->SetAttribute("hello",20);

           TiXmlElement * element1 = new TiXmlElement( "AMULE_ToDL" );//添加一个节点
               element1->SetAttribute("num",5);
               pParent->LinkEndChild(element1);

           pDoc->SaveFile(); //保存文件              
        }
    printf( "/n" );
    for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling()) 
        {
            search(pChild);
    }
      
}
void search2(TiXmlNode* pParent)//另一种方法:
{
       if ( !pParent ) return;
       
       TiXmlNode* pChild= NULL;
       TiXmlNode*tmp = NULL;
           int t = pParent->Type();

       tmp = pParent->FirstChild("Window");//搜索元素值为"Window"的节点
       if(tmp){
        
      //pParent->RemoveChild(tmp);//找到后删除此节点
            
       TiXmlElement * element1 = new TiXmlElement( "AMULE_ToDL" );
           element1->SetAttribute("num",5);

       pParent->ReplaceChild(tmp,*element1);//找到"AMULE_ToDL"节点后替换此节点
       
       }

       pDoc->SaveFile(); //保存文件               
        
    printf( "/n" );
    for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling()) //遍历一个节点的所兄弟节点,记着单词sibling是兄弟, 姐妹的意思
                                                                                                                                //也就是说FirstChild()和NextSibling()不是 父节点和子节点的关系
    {
            search2(pChild);//遍历一个节点的所有子节点
    }
      
}
int main(int argc, char* argv[])
   {

        TiXmlDocument doc(argv[1]);
        bool loadOkay = doc.LoadFile();
        if (loadOkay)
        {
            pDoc = &doc;
                printf("/n%s:/n", argv[1]);
                //dump_to_stdout( &doc ); // defined later in the tutorial
                search2(&doc);                //把TiXmlDocument类型的值复制给一个TiXmlNode类型
        }
        else
        {
                printf("Failed to load file /"%s/"/n", argv[1]);
        }
  
     return 0;
   }


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有