1. 程式人生 > >C++使用TinyXml2解析Xml

C++使用TinyXml2解析Xml

1. TinyXml2 簡介

TinyXml 一直是一個非常好用的 Xml 解析工具 , 最新的開源版本 TinyXml2 相對於舊版本的 TinyXml 使用更少的記憶體 , 更快 , 並且使用更少的記憶體分配 , 現在是所有開發的重點 , 經過良好的測試 , 是您的最佳選擇 , 除非您有維護TinyXML-1程式碼的要求 ;

TinyXml2 使用類似的 APITinyXml1 和相同的豐富的測試用例 , 但解析器的實現是完全重寫的 , 使其更適合在遊戲中使用 ;

TinyXml2不需要 STL , 但也降低了所有的 STL 支援 , 所有字串都是查詢並設定為 const char *

, 這允許使用內部分配器 , 並保持程式碼更簡單 ;

兩個解析器共同點 :

TinyXml2 的優點 :

  1. 所有未來開發的重點
  2. 更少的記憶體分配 (1/10到1/100) , 使用更少的記憶體 (大約TinyXml1的40%) , 並且更快
  3. 無STL要求
  4. 更現代的C++ , 包括一個正確的名稱空間
  5. 適當和有用的處理空白

TinyXML-1 的優點 :

  1. 支援一些C++ STL 約定 : 流和字串
  2. 非常成熟和除錯良好的程式碼庫

2. 在 C++ 中使用 TinyXml2

  1. 將解壓出來檔案裡面的 tinyxml2.htinyxml2.cpp 檔案拷貝到工程目錄原始碼資料夾下 , 在專案中新增這兩個檔案

    AddToSln

  2. 在程式碼標頭檔案中引入標頭檔案和名稱空間

    #include "tinyxml2.h"
    using namespace tinyxml2;
    
  3. 在程式碼中使用 TinyXml2 解析文件

    1. Xml 文件如下

      <?xml version="1.0"?>  
      <Group>
          <User>
              <Name>John</Name>
              <Age>18</Age>
          </User>
      </Group>  
      
    2. 程式碼中載入並解析改檔案

      XMLDocument docXml;
      XMLError errXml = docXml.LoadFile("example.xml");
      if (XML_SUCCESS == errXml)
      {
          XMLElement* elmtRoot = docXml.RootElement();
          XMLElement *elmtUser = elmtRoot->FirstChildElement("User");
          XMLElement *elmtName = elmtUser->FirstChildElement("Name");
          if (elmtName)
          {
              const char* pContent= elmtName->GetText();
              printf( "%s", pContent);
          }
          XMLElement *elmtAge = elmtName->NextSiblingElement();
          if (elmtAge)
          {
              const char* pContent= elmtAge->GetText();
              printf( "%s", pContent);
          }
      }
      
    3. 或者直接解析字串

      XMLDocument docXml;
      char* pXml = "<Item>Hello World</Item>";
      XMLError errXml = docXml.Parse(pXml);
      if (XML_SUCCESS == errXml)
      {
          XMLElement* elmtRoot = docXml.RootElement();
          if (elmtRoot)
          {
              const char* pContent= elmtRoot->GetText();
              printf( "%s", pContent);
          }
      }
      

    注意 : 如果名稱空間衝突的話 , 可能會導致 XMLDocument 物件不明確 , 使用 tinyxml2::XMLDocument 來使用

個人網站: Github , 歡迎點選給星