前一陣子做一個客服回復玩家問題工具,要用到讀寫XML文件的數據,同事推薦用TinyXML,於是,開始了我與TinyXML的親密之旅。
先簡單說說配置:首先下載TinyXML庫的文件,然後在 TinyXML 的目錄裡面找到tinystr.h, tinyxml.h,tinystr.cpp,tinyxml.cpp, tinyxmlerror.cpp,tinyxmlparser.cpp六個文件加入到自己的項目中去,在相應的工程文件中加入兩個頭文件 #include "tinyxml.h" ,#include "tinystr.h",在 tinystr.cpp,tinyxml.cpp, tinyxmlerror.cpp, tinyxmlparser.cpp四個文件的第一行加入頭文件 #include "stdafx.h",然後即可使用TinyXML編程。
要讀取的XML 數據如下:
- <?XML version="1.0" encoding="gb2312" standalone="yes" ?>
- <root XMLns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <prop>
- <id>100</id>
- <title>test 1</title>
- </prop>
- <prop>
- <id>200</id>
- <title>test 2</title>
- </prop>
- </root>
注意要將 encoding設為gb2312格式,我一開始設置的是utf-8,結果遇到在程序裡
寫入中文沒問題, 但在讀出該中文時卻有異常,把後面的 </ 符號也當作值讀出來
了,後來和一同事討論後才知道是編碼問題。
- string filefullPath = 要讀取XML文件的絕對路徑
- //創建文件對象
- TiXMLDocument * myDocument = new TiXMLDocument(filefullPath.c_str());
- //加載文件數據
- myDocument->LoadFile();
- //獲取根節點
- TiXMLElement *RootElement = myDocument->RootElement();
以下是簡單的讀取操作:
- //第一個子節點
- TiXMLElement *CurrentPerson = RootElement->FirstChildElement();
- //遍歷獲取指定節點數據
- while(CurrentPerson)
- {
- //子節點第一個屬性 id
- TiXMLElement *IdElement = CurrentPerson->FirstChildElement();
- //第一個屬性的值
- int nodeID = atoi(IdElement->FirstChild()->Value());
- //子節點第二個屬性 title
- TiXMLElement *TitleElement = IdElement->NextSiblingElement();
- //第二個屬性的值
- CString nodeTitle = TitleElement->FirstChild()->Value();
- .....................
- 如果還有後續節點,依次讀取
- .....................
- 維護讀出的數據
- .....................
- //指向下一節點
- CurrentPersonCurrentPerson = CurrentPerson->NextSiblingElement();
- }
以下是增加XML記錄的操作,例如要增加 id 為 300,title 為 test3 的記錄:
- //創建節點對象
- TiXMLElement *PersonElement = new TiXMLElement("prop");
- //鏈接到根節點
- RootElement ->LinkEndChild(PersonElement);
- //創建節點對象的屬性節點
- TiXMLElement *IdElement = new TiXMLElement("id");
- TiXMLElement *TitleElement =new TiXMLElement("title");
- //將屬性節點鏈接到子節點
- PersonElement->LinkEndChild(IdElement);
- PersonElement->LinkEndChild(TitleElement);
- //創建屬性對應數值對象
- TiXMLText *idContent = new TiXMLText("300");
- TiXMLText *titleContent = new TiXMLText("test3");
- //將數值對象關聯到屬性節點
- IdElement->LinkEndChild(idContent);
- TitleElement->LinkEndChild(titleContent);
- //保存到文件
- myDocument->SaveFile(m_filefullPath.c_str());
以下是刪除記錄操作,例如要刪除id為300 的記錄:
- //獲取當前要刪除的節點
- TiXMLElement * childElement = 根據id從自己讀取時緩存的數據中獲得
- //從根節點移除子節點
- RootElement->RemoveChild(childElement);
- //保存文件
- myDocument->SaveFile(m_filefullPath.c_str());
學習TinyXML主要是要理解其節點的層次關系,通曉其筋脈,則運用自如。
原文鏈接:http://www.cnblogs.com/skydesign/archive/2011/11/08/2240528.Html
【編輯推薦】