• TinyXml 读写XML文件 .


    使用Tinyxml创建和读取XML文件的优点:1,可在Windows和Linux中使用;2,方便易学,易用,可在http://sourceforge.net/projects/tinyxml/获取源代码。将其中的文件tinystr.h,tinyxml.h,tinystr.cpp,tinyxmlerror.cpp,tinyxmlparser.cpp和tinyxml.cpp拷贝到您的工程目录,即可方便使用。

        下边我写了一个简单的测试程序,创建XML文件,之后从该文件中读取XML节点元素。测试程序在VS2005中测试通过。

    1. #include <iostream>   
    2. #include "tinyxml.h"   
    3. using namespace std;  
    4. #pragma warning(disable:4996)   
    5. #define  XML_STR_FILE           "cat.xml"  
    6. #define  XML_STR_ROOT           "xml-root"  
    7. #define  XML_STR_CAT_INFO       "cat-info"  
    8. #define  XML_STR_CAT_NUM        "num"  
    9. #define  XML_STR_CAT_AGE        "age"  
    10. #define  XML_STR_CAT_COLOR      "color"  
    11. #define  XML_STR_CAT_NAME       "name"  
    12. #define  IN   
    13. #define  OUT   
    14. #define  RET_OK                 0   
    15. #define  RET_ERR                -1  
    16. #define  NAME_LENGTH            20   
    17. #define  COLOR_LENGTH           20  
    18. #define  BUF_SIZE               32   
    19. #define  XML_RETURN(x)          { if( RET_OK != (x) ) return RET_ERR; }  
    20. #define  XML_ASSERT(x)          { if( NULL == (x) ) return RET_ERR; }  
    21. struct CAT_INFO  
    22. {   
    23.     CAT_INFO():iAge(0)  
    24.     {   
    25.         szName[0] = '/0';   
    26.         szColor[0] = '/0';   
    27.     };  
    28.     int iAge; //age  
    29.     char szName[NAME_LENGTH]; //name  
    30.     char szColor[COLOR_LENGTH]; //color  
    31. };  
    32. typedef CAT_INFO * PCAT_INFO;  
    33. class Cat_List_Info  
    34. {  
    35. public:  
    36.     Cat_List_Info( bool bDel ):bIsDelete( bDel ), iNum( 0 ), pCatList( NULL )  
    37.     {  
    38.           
    39.     };  
    40.     ~Cat_List_Info()  
    41.     {   
    42.         if( bIsDelete && pCatList )  
    43.         {   
    44.             delete []pCatList;   
    45.             pCatList = NULL;   
    46.         }   
    47.     };  
    48. public:  
    49.     int iNum; //cats number  
    50.     PCAT_INFO pCatList; //list   
    51. private:  
    52.     bool bIsDelete;  
    53. };  
    54. //add leaf node   
    55. int AddLeafNode( TiXmlNode* pElmParent, const char* pszNode, const char* pszText )  
    56. {  
    57.     TiXmlElement elmNode(pszNode);  
    58.     TiXmlText elmText(pszText);  
    59.     XML_ASSERT( elmNode.InsertEndChild( elmText ) );  
    60.     XML_ASSERT( pElmParent->InsertEndChild( elmNode ) );  
    61.     return RET_OK;  
    62. }  
    63. //get leaf node   
    64. int GetLeafNode( TiXmlNode* pElmParent, char* pszNode, char* pszText )  
    65. {     
    66.     TiXmlNode *pTemp;  
    67.     if ( pElmParent && ( pTemp = pElmParent->FirstChild( pszNode ) ) )  
    68.     {  
    69.         if ( pTemp = pTemp->FirstChild() )  
    70.         {  
    71.             strcpy( pszText, pTemp->Value() );  
    72.             return RET_OK;  
    73.         }  
    74.     }  
    75.     return RET_ERR;  
    76. }  
    77. int WriteXmlToFile( IN Cat_List_Info *pCats )  
    78. {  
    79.     TiXmlDeclaration Declaration( "1.0","""" );  
    80.     TiXmlDocument xmlDoc( XML_STR_FILE );   
    81.     xmlDoc.InsertEndChild( Declaration );   
    82.     TiXmlElement elmRoot( XML_STR_ROOT );  
    83.     char szBuf[BUF_SIZE];  
    84.     szBuf[0] = '/0';  
    85.     if ( !pCats )  
    86.     {  
    87.         return RET_ERR;  
    88.     }  
    89.     if ( pCats->iNum > 0)  
    90.     {  
    91.         //num   
    92.         sprintf( szBuf,"%d", pCats->iNum );  
    93.         XML_RETURN( AddLeafNode( &elmRoot, XML_STR_CAT_NUM, szBuf ) );  
    94.     }  
    95.     else  
    96.     {  
    97.         return RET_ERR;  
    98.     }  
    99.     for ( int i = 0; i < pCats->iNum; i++ )  
    100.     {  
    101.         TiXmlElement elmCat( XML_STR_CAT_INFO );  
    102.         //name   
    103.         if ( '/0' != pCats->pCatList[i].szName[0] )  
    104.         {  
    105.             XML_RETURN( AddLeafNode( &elmCat, XML_STR_CAT_NAME, pCats->pCatList[i].szName ) );  
    106.         }  
    107.         //age   
    108.         sprintf( szBuf,"%d", pCats->pCatList[i].iAge );  
    109.         XML_RETURN( AddLeafNode( &elmCat, XML_STR_CAT_AGE, szBuf ) );  
    110.         //color   
    111.         if ( '/0' != pCats->pCatList[i].szColor[0] )  
    112.         {  
    113.             XML_RETURN( AddLeafNode( &elmCat, XML_STR_CAT_COLOR, pCats->pCatList[i].szColor ) );  
    114.         }  
    115.         XML_ASSERT( elmRoot.InsertEndChild( elmCat ) );  
    116.     }  
    117.     XML_ASSERT( xmlDoc.InsertEndChild( elmRoot ) );  
    118.     //save   
    119.     xmlDoc.SaveFile();  
    120.     return RET_OK;  
    121. }  
    122.   
    123. int ReadXmlFromFile( OUT Cat_List_Info *pCats )  
    124. {  
    125.     TiXmlElement *pRootNode = NULL;  
    126.     TiXmlElement *pTemp = NULL;  
    127.     char szBuf[BUF_SIZE];  
    128.     szBuf[0] = '/0';  
    129.     if (!pCats)  
    130.     {  
    131.         return RET_ERR;  
    132.     }  
    133.     TiXmlDocument xmlDoc( XML_STR_FILE );   
    134.     if( !xmlDoc.LoadFile() )   
    135.         return RET_ERR;  
    136.     XML_ASSERT( pRootNode = xmlDoc.RootElement() );  
    137.     pTemp = pRootNode->FirstChildElement( XML_STR_CAT_NUM );  
    138.     if ( pTemp )  
    139.     {  
    140.         GetLeafNode( pRootNode, XML_STR_CAT_NUM, szBuf );  
    141.         pCats->iNum = atoi( szBuf );  
    142.     }  
    143.     if ( pCats->iNum > 0 )  
    144.     {  
    145.         TiXmlNode *pCat = NULL;  
    146.         pCat = pRootNode->FirstChild( XML_STR_CAT_INFO );  
    147.         if ( pCat )  
    148.         {  
    149.             for ( int i = 0; i < pCats->iNum; i++ )  
    150.             {  
    151.                 //name   
    152.                 GetLeafNode( pCat, XML_STR_CAT_NAME, pCats->pCatList[i].szName );  
    153.                 //age   
    154.                 GetLeafNode( pCat, XML_STR_CAT_AGE, szBuf );  
    155.                 pCats->pCatList[i].iAge = atoi(szBuf);     
    156.                 //color   
    157.                 GetLeafNode( pCat, XML_STR_CAT_COLOR, pCats->pCatList[i].szColor );  
    158.                 pCat = pCat->NextSibling();  
    159.             }  
    160.         }  
    161.     }  
    162.     else  
    163.     {  
    164.         return RET_ERR;  
    165.     }  
    166.     return RET_OK;  
    167. }  
    168. int main(int argc, char* argv[])  
    169. {  
    170.     Cat_List_Info cats(true);  
    171.     cats.iNum = 2;  
    172.     cats.pCatList = new CAT_INFO[cats.iNum];  
    173.     if ( NULL == cats.pCatList )  
    174.     {  
    175.         cout<<"no memory..."<<endl;  
    176.         return RET_ERR;  
    177.     }  
    178.     cats.pCatList[0].iAge = 5;  
    179.     strcpy( cats.pCatList[0].szColor, "white" );  
    180.     strcpy( cats.pCatList[0].szName, "Bob" );  
    181.       
    182.     cats.pCatList[1].iAge = 6;  
    183.     strcpy( cats.pCatList[1].szColor, "black" );  
    184.     strcpy( cats.pCatList[1].szName, "Tom" );  
    185.     int iRet = WriteXmlToFile( &cats );  
    186.       
    187.     iRet = ReadXmlFromFile( &cats );  
    188.     if ( RET_OK == iRet )  
    189.     {  
    190.         for ( int i = 0; i < cats.iNum; i++ )  
    191.         {  
    192.             cout<<i<<" cat's name is "<<cats.pCatList[i].szName<<endl;  
    193.             cout<<i<<" cat's age is "<<cats.pCatList[i].iAge<<endl;  
    194.             cout<<i<<" cat's color is "<<cats.pCatList[i].szColor<<endl;  
    195.         }  
    196.     }  
    197.     system( "pause" );  
    198.     return 0;  
    199. }  

    下边是生成的cat.xml文件

    1. <?xml version="1.0" ?>  
    2. <xml-root>  
    3.     <num>2</num>  
    4.     <cat-info>  
    5.         <name>Bob</name>  
    6.         <age>5</age>  
    7.         <color>white</color>  
    8.     </cat-info>  
    9.     <cat-info>  
    10.         <name>Tom</name>  
    11.         <age>6</age>  
    12.         <color>black</color>  
    13.     </cat-info>  
    14. </xml-root>  

    从cat.xml文件读取节点元素,进行打印

  • 相关阅读:
    NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象
    OC,查找字符串2在字符串1中出现的次数
    iOS开发知识碎片----01
    iOS中pch文件的应用
    UIKit性能调优实战讲解
    尽量将View设置为Opaque,iOS开发技巧
    Xcode开发技巧之code snippets(代码片段)
    【工具】openwrt安装记录
    【对象模型】C++模版的编译链接过程——编译器真的会检查所有tocken层面的错误么?
    【转】利用TCMalloc优化Nginx的性能
  • 原文地址:https://www.cnblogs.com/jinsedemaitian/p/5589099.html
Copyright © 2020-2023  润新知