• TiXml使用详解


    转载:http://blog.csdn.net/appletreesujie/archive/2009/05/21/4207435.aspx

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

    7、TinyXml的在线文档和主页:    http://www.grinninglizard.com/tinyxmldocs/index.html

    8、常用操作详解:

    glibc[~]# cat example.cc
    #include "tinyxml.h"
    #include <iostream>
    using namespace std;

    TiXmlDocument *pDoc =NULL;
    void write_xml( )/*写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;
       }

    /*void dump_to_stdout1(const char* pFilename)
    {
            TiXmlDocument doc(pFilename);
            bool loadOkay = doc.LoadFile();
            if (loadOkay)
            {
                    printf("\n%s:\n", pFilename);
                    dump_to_stdout( &doc ); // defined later in the tutorial
            }
            else
            {
                    printf("Failed to load file \"%s\"\n", pFilename);
            }

    int main(int argc, char* argv[])
    {
            for (int i=1; i<argc; i++)
            {
                    dump_to_stdout1(argv[i]);
            }
            return 0;
    }*/

  • 相关阅读:
    解析HTTP协议六种请求方法
    金蝶
    普元
    中间件
    [CTSC2008] 网络管理
    【Uva 10498】满意值
    【SPOJ839】最优标号
    bzoj2879 [Noi2012]美食节
    bzoj3144 [Hnoi2013]切糕
    bzoj3112 [Zjoi2013]防守战线
  • 原文地址:https://www.cnblogs.com/tianya10319/p/2011855.html
Copyright © 2020-2023  润新知