TinyXml使用详解

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

     首先简单介绍一下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;
}*/

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TinyXML是一个小型的、简单易用的XML解析器,适用于C++环境。它的主要特点是简单易用、轻量级、跨平台、可移植性强。本文将介绍TinyXML使用方法。 ## TinyXML的安装 TinyXML的安装非常简单,只需要下载TinyXML的源代码,并将其包含到你的项目中即可。TinyXML的源代码可以在其官方网站(http://www.grinninglizard.com/tinyxml/)上下载。 ## TinyXML的基本用法 TinyXML使用非常简单,只需要包含TinyXML头文件,并使用其提供的API即可完成XML文件的解析和生成。 ### 解析XML文件 以下是一个简单的XML文件example.xml: ``` <?xml version="1.0" encoding="UTF-8"?> <root> <person> <name>John</name> <age>20</age> </person> <person> <name>Jane</name> <age>21</age> </person> </root> ``` 我们可以使用如下代码来解析该XML文件: ```c++ #include "tinyxml.h" #include <iostream> using namespace std; int main() { TiXmlDocument doc("example.xml"); bool loadOkay = doc.LoadFile(); if (loadOkay) { TiXmlNode* root = doc.FirstChild("root"); if (root) { for (TiXmlNode* node = root->FirstChild(); node; node = node->NextSibling()) { if (node->Type() == TiXmlNode::TINYXML_ELEMENT && strcmp(node->Value(), "person") == 0) { TiXmlNode* nameNode = node->FirstChild("name"); TiXmlNode* ageNode = node->FirstChild("age"); if (nameNode && ageNode) { cout << "name:" << nameNode->FirstChild()->Value() << endl; cout << "age:" << ageNode->FirstChild()->Value() << endl; } } } } } return 0; } ``` 上述代码首先创建了一个TiXmlDocument对象,并调用其LoadFile方法加载example.xml文件。如果加载成功,则获取XML文档的根节点,并循环遍历根节点的所有子节点,查找名称为“person”的节点,并获取其下的“name”和“age”子节点的值。 ### 生成XML文件 我们可以使用TinyXML来生成XML文件。以下是一个简单的示例: ```c++ #include "tinyxml.h" #include <iostream> using namespace std; int main() { TiXmlDocument doc; TiXmlElement* root = new TiXmlElement("root"); doc.LinkEndChild(root); for (int i = 0; i < 3; i++) { TiXmlElement* person = new TiXmlElement("person"); root->LinkEndChild(person); TiXmlElement* name = new TiXmlElement("name"); person->LinkEndChild(name); TiXmlText* nameText = new TiXmlText("John"); name->LinkEndChild(nameText); TiXmlElement* age = new TiXmlElement("age"); person->LinkEndChild(age); TiXmlText* ageText = new TiXmlText("20"); age->LinkEndChild(ageText); } doc.SaveFile("example.xml"); return 0; } ``` 上述代码创建了一个TiXmlDocument对象,并创建了一个名为“root”的根节点。然后循环生成三个名为“person”的节点,并为每个节点添加名为“name”和“age”的子节点,并设置其值。最后,调用TiXmlDocument的SaveFile方法将生成的XML文件保存到example.xml中。 ## 小结 TinyXML是一个简单易用的XML解析器,适用于C++环境,其主要特点是简单易用、轻量级、跨平台、可移植性强。使用TinyXML可以轻松地解析和生成XML文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值