TinyXml高速入门(一)
作者:朱金燦
來源:http://blog.csdn.net/clever101
????? 對于xml文件,眼下我的工作僅僅是集中在配置文件和作為簡單的信息文件來用,因此我不太喜歡使用msxml這樣的重量級的xml解析器,特別是使用msxml解析xml涉及到復雜的com類型轉換,更是令人感覺繁瑣。因此對于簡單的xml文件的解析,我更愿意使用開源的TinyXml。
????? 首先介紹一下TinyXml吧。TinyXML是眼下很流行的一款基于DOM模型的XML解析器,簡單易用且小巧玲瓏,很適合存儲簡單數據,配置文件,對象序列化等數據量不是很大的操作,其主頁是:http://www.grinninglizard.com/tinyxml/ ,眼下最新版本號是2.5.3 版本號。
TinyXml網上的教程非常多,可是我認為寫得都不如何(感覺就是看完之后就沒學會)。沒辦法,僅僅得自己整理一篇適合自己的,至于適不適合別人,就見仁見智了。我感覺xml文件本質就是小型的數據庫,換個角度來說就是,你對數據庫有什么操作你對xml文件就應能實現什么操作。一般而言,對數據庫的操作包含下面幾種:新建數據庫、查詢數據庫、改動數據庫和刪除數據庫。那么相應xml文件就是新建xml文件、查詢xml文件的指定節點的值,改動xml文件里節點的值和刪除xml文件里節點的值。
?????? 首先我們認識一下xml文件有哪幾種形式。以下我列出一些經常使用的xml文件的形式:
example1.xml: <?xml version="1.0" ?> <Hello>World</Hello> example2.xml: <?xml version="1.0" ?> <poetry> <verse> Alas Great World Alas (again) </verse> </poetry> example3.xml: <?xml version="1.0" ?> <shapes> <circle name="int-based" x="20" y="30" r="50" /> <point name="float-based" x="3.5" y="52.1" /> </shapes> example4.xml: <?xml version="1.0" ?> <MyApp> <Messages> <Welcome>Welcome to MyApp</Welcome> <Farewell>Thank you for using MyApp</Farewell> </Messages> <Windows> <Window name="MainFrame" x="5" y="15" w="400" h="250" /> </Windows> <Connection ip="192.168.0.1" timeout="123.456000" /> </MyApp>
????? 上面的樣例摘自《TinyXML Tutorial 中文指南》。上面有四個樣例,你看到了xml文件的幾種表現形式?我看到了本質來說只是是兩種表現形式:屬性值值在尖括號內,如<Window name="MainFrame" x="5" y="15" w="400" h="250" />和文本在尖括號外,如<Welcome>Welcome to MyApp</Welcome>,詳細例如以下圖:
???? 鑒于example4.xml比較復雜,以下我將以此為例介紹tinyxml的使用。
???? Tinyxml使用了兩種編譯選擇:使用標準C的char *類型或者使用STL中的std::string,當中使用預處理器TIXML_USE_STL進行控制,即加入�了TIXML_USE_STL為使用std::string的。鑒于STL的廣泛使用以及其強大功能,以下我以使用std::string的tinyxml說明。
首先使用VS 2005打開tinyxmlSTL.dsp的project文件,將其編譯成一個靜態庫,debug版本號為:tinyxmld_STL.lib,然后開始測試tinyxml庫。我的測試計劃是這種:首先使用tinyxml庫創建example4.xml,然后將其讀出來,然后查詢指定節點的屬性或文本,再改動example4.xml(改動當中的一些節點值和刪除當中一個節點,添加�一個節點),然后再讀出來以推斷是否改動成功。詳細是在VS 2005上新建一個控制臺project:Test,注意使用多字節字符集進行編譯,同一時候加入�。首先是創建xml文件的代碼:
???? /*! * /brief 創建xml文件。 * * /param XmlFile xml文件全路徑。 * /return 是否成功。true為成功,false表示失敗。 */ bool CreateXml(std::string XmlFile) { // 定義一個TiXmlDocument類指針 TiXmlDocument *pDoc = new TiXmlDocument; if (NULL==pDoc) { return false; } TiXmlDeclaration *pDeclaration = new TiXmlDeclaration(_T("1.0"),_T(""),_T("")); if (NULL==pDeclaration) { return false; } pDoc->LinkEndChild(pDeclaration); // 生成一個根節點:MyApp TiXmlElement *pRootEle = new TiXmlElement(_T("MyApp")); if (NULL==pRootEle) { return false; } pDoc->LinkEndChild(pRootEle); // 生成子節點:Messages TiXmlElement *pMsg = new TiXmlElement(_T("Messages")); if (NULL==pMsg) { return false; } pRootEle->LinkEndChild(pMsg); // 生成子節點:Welcome TiXmlElement *pWelcome = new TiXmlElement(_T("Welcome")); if (NULL==pWelcome) { return false; } pMsg->LinkEndChild(pWelcome); // 設置Welcome節點的值 std::string strValue = _T("Welcome to MyApp"); TiXmlText *pWelcomeValue = new TiXmlText(strValue); pWelcome->LinkEndChild(pWelcomeValue); // 生成子節點:Farewell TiXmlElement *pFarewell = new TiXmlElement(_T("Farewell")); if (NULL==pFarewell) { return false; } pMsg->LinkEndChild(pFarewell); // 設置Farewell節點的值 strValue = _T("Thank you for using MyApp"); TiXmlText *pFarewellValue = new TiXmlText(strValue); pFarewell->LinkEndChild(pFarewellValue); // 生成子節點:Windows TiXmlElement *pWindows = new TiXmlElement(_T("Windows")); if (NULL==pWindows) { return false; } pRootEle->LinkEndChild(pWindows); // 生成子節點:Window TiXmlElement *pWindow = new TiXmlElement(_T("Window")); if (NULL==pWindow) { return false; } pWindows->LinkEndChild(pWindow); // 設置節點Window的值 pWindow->SetAttribute(_T("name"),_T("MainFrame")); pWindow->SetAttribute(_T("x"),_T("5")); pWindow->SetAttribute(_T("y"),_T("15")); pWindow->SetAttribute(_T("w"),_T("400")); pWindow->SetAttribute(_T("h"),_T("250")); // 生成子節點:Window TiXmlElement *pConnection = new TiXmlElement(_T("Connection")); if (NULL==pConnection) { return false; } pRootEle->LinkEndChild(pConnection); // 設置節點Connection的值 pConnection->SetAttribute(_T("ip"),_T("192.168.0.1")); pConnection->SetAttribute(_T("timeout"),_T("123.456000")); pDoc->SaveFile(XmlFile); return true; }?
?????? 不知你注意到上面的規律沒有?首先父節點連接字節點使用函數LinkEndChild,用法是:pParentNode-> LinkEndChild(pChild);其次設置相似這樣的結構<Window name="MainFrame" x="5" y="15" w="400" h="250" />採用SetAttribute函數,這個函數有兩個參數,前一個參數表示鍵,后一個參數表示鍵值,設置<Farewell>Thank you for using MyApp</Farewell>這樣的結構採用TiXmlText類,使用LinkEndChild函數進行連結。
????? 上面是創建xml文件的代碼,以下介紹讀取xml文件的代碼。打印整個xml文件的代碼非常easy,代碼例如以下:
/*! * /brief 打印xml文件。 * * /param XmlFile xml文件全路徑。 * /return 是否成功。true為成功,false表示失敗。 */ bool PaintXml(std::string XmlFile) { // 定義一個TiXmlDocument類指針 TiXmlDocument *pDoc = new TiXmlDocument(); if (NULL==pDoc) { return false; } pDoc->LoadFile(XmlFile); pDoc->Print(); return true; }
?? 下次介紹使用tinyxml庫對xml文件進行查詢指定節點、刪除指定節點、改動指定節點和添加�節點的使用方法。
參考文獻:
1.《TinyXML新手教程 》
2. 《tinyxml 使用筆記與總結 》
3. 《TinyXML Tutorial 中文指南 》
轉載于:https://www.cnblogs.com/yxwkf/p/4034888.html
總結
以上是生活随笔為你收集整理的TinyXml高速入门(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL Server 事务隔离级别的解析
- 下一篇: SQL Server 数据库状态选项