1. 程式人生 > >pugixml簡介

pugixml簡介

               

作者:朱金燦

          很久沒寫部落格了,難得今天有空,心情也不錯。寫什麼內容呢?就寫寫最近接觸的一個很棒的xml操作庫——pugixml。

         以前覺得tinyxml也是一個挺好的操作xml檔案的庫。最近找到了pugixml庫,發現pugixml庫對tinyxml可謂是全面勝出。

一.支援字符集:tinyxml不支援unicode(這個可謂是很多人不願意用tinyxml的原因之一),pugixml支援UTF8 encoding、Little-endian UTF16、Big-endian UTF16、UTF16 with native endianness、Little-endianUTF32、Big-endian UTF32和UTF32with native endianness。

二.操作xml檔案的效能。

              Xml庫解析效能比較表  

       看看上表吧,pugixml比tinyxml快不止一個數量級,僅比最快的RapidXml慢一點。pugixml比RapidXml的一個優點是pugixml支援xpath, RapidXml不支援xpath。

一.使用的方便性。雖然pugixml和tinyxml都是基於面向物件的,但pugixml的使用方便性遠勝tinyxml。比如在查詢節點的屬性值方面,Tinyxml需要呼叫者從根節點開始查詢(使用TiXmlElement類),然後遞迴找下去,找到到取出屬性值。而pugixml使用一個child函式把查詢節點這一步都封裝好了。比如下面這樣一個xml檔案:

      
<?xml version="1.0" encoding="UTF-8" standalone="no" ?><Profile FormatVersion="1">    <Tools>        <Tool Filename="jam" AllowIntercept="true">         <Description>Jamplus build system</Description>        </Tool>        <Tool Filename="mayabatch.exe"
AllowRemote="true" OutputFileMasks="*.dae" DeriveCaptionFrom="lastparam" Timeout="40" />
        <Tool Filename="meshbuilder_*.exe" AllowRemote="false" OutputFileMasks="*.mesh" DeriveCaptionFrom="lastparam" Timeout="10" />        <Tool Filename="texbuilder_*.exe" AllowRemote="true" OutputFileMasks="*.tex" DeriveCaptionFrom="lastparam" />        <Tool Filename="shaderbuilder_*.exe" AllowRemote="true" DeriveCaptionFrom="lastparam" />    </Tools></Profile>
     使用pugixml簡單幾句程式碼就能將所有Tool節點的屬性值都輸出來:
pugi::xml_document doc;    if (!doc.load_file("xgconsole.xml")) return -1;    pugi::xml_node tools = doc.child("Profile").child("Tools");    //[code_traverse_base_basic    for (pugi::xml_node tool = tools.first_child(); tool; tool = tool.next_sibling())    {        std::cout << "Tool:";        for (pugi::xml_attribute attr = tool.first_attribute(); attr; attr = attr.next_attribute())        {            std::cout << " " << attr.name() << "=" << attr.value();        }        std::cout << std::endl;    }//]
          是不是很方便呢?