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文件读取节点元素,进行打印

原文地址:https://www.cnblogs.com/jinsedemaitian/p/5589099.html