分享一个XML解析库 -- TinyXML

C/C++代码 blackfeather

 

解析XML很常见的功能,网上库也很多,有的大有的小,有的用起来方便有的繁琐。博主测试了几个库,最后用这了这个库,分享出来。

 

TinyXML,能百度到很多使用的demo代码,用起来确实很方便,我附件里面的是单文件版,只有一个.hpp(就是.h),直接include后就能使用。

 

点击下载:tinyXML.hpp.gz

 

顺便贴一个很好的使用实例:

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);//遍历一个节点的所有子节点   
    }   
         
}


 

评论列表:

发表评论: