相關文章
TinyXML2 學習: http://www.tuicool.com/articles/uYBB7j
C++使用tinyxml建立和解析xml檔案(本文用於cocos2dx):http://blog.csdn.net/u012234115/article/details/38643259 聲明
我是由於工作原因使用的tinyXML,源碼是直接由老大提供給我的,與網上流傳的不太一樣,所以我也不知道下載連結在哪,但是我會在文章末尾附帶的源碼
前言
TinyXML是一個開源的解析XML的解析庫,能夠用於C++,能夠在Windows或Linux中編譯,使用TinyXML進行C++ XML解析,使用簡單,容易上手。這個解析庫的模型通過解析XML檔案,然後在記憶體中產生DOM模型,從而讓我們很方便的遍曆這棵XML樹。 DOM模型即文件物件模型,是將整個文檔分成多個元素(如書、章、節、段等),並利用樹型結構表示這些元素之間的循序關聯性以及嵌套內含項目關聯性。
TinyXML介紹
在TinyXML中,根據XML的各種元素來定義了一些類: XmlBase:整個TinyXML模型的基類。 XmlAttribute:對應於XML中的元素的屬性。 XmlNode:對應於DOM結構中的節點。 XmlComment:對應於XML中的注釋。 XmlDeclaration:對應於XML中的申明部分,即<。versiong="1.0" ?>。 XmlDocument:對應於XML的整個文檔。 XmlElement:對應於XML的元素。 XmlText:對應於XML的文字部分。 XmlUnknown:對應於XML的未知部分。 XmlHandler:定義了針對XML的一些操作。
應用執行個體
通過對下面這個XML進行建立,讀取來熟悉API
<?xml version="1.0"?> <School name="軟體學院"> <Class name = "C++"> <Student name="tinyxml" number="123"> <email>tinyxml@163.com</email> <address>中國</address> </Student> <Student name="jsoncpp" number="456"> <email>jsoncpp@gmail.com</email> <address>美國</address> </Student> </Class> </School>
建立XML
bool createXML(){ XMLDocument *doc = new XMLDocument; XMLDeclaration *declaration = doc->NewDeclaration("xml version=\"1.0\" encoding=\"GBK\""); doc->LinkEndChild(declaration); XMLElement *eleSchool = doc->NewElement("School"); doc->LinkEndChild(eleSchool); eleSchool->SetAttribute("name", "軟體學院"); //設定屬性 XMLElement *eleClass = doc->NewElement("Class"); eleSchool->LinkEndChild(eleClass); //掛在School節點上 eleClass->SetAttribute("name", "C++"); //------------------------------第一個學生 XMLElement *eleStudent = doc->NewElement("Student"); eleClass->LinkEndChild(eleStudent); //掛在School節點上 //可以設定多個屬性 eleStudent->SetAttribute("name", "tinyxml"); eleStudent->SetAttribute("number", 123); XMLElement *eleEmail = doc->NewElement("email"); eleStudent->LinkEndChild(eleEmail); XMLText *texEmail = doc->NewText("tinyxml@163.com"); eleEmail->LinkEndChild(texEmail); XMLElement *eleAddress = doc->NewElement("address"); eleStudent->LinkEndChild(eleAddress); XMLText *texAddress = doc->NewText("中國"); eleAddress->LinkEndChild(texAddress); //------------------------------第二個學生 XMLElement *eleStudent1 = doc->NewElement("Student"); eleClass->LinkEndChild(eleStudent1); //掛在School節點上 eleStudent1->SetAttribute("name", "jsoncpp"); eleStudent1->SetAttribute("number", 456); XMLElement *eleEmail1 = doc->NewElement("email"); eleStudent1->LinkEndChild(eleEmail1); XMLText *texEmail1 = doc->NewText("jsoncpp@gmail.com"); eleEmail1->LinkEndChild(texEmail1); XMLElement *eleAddress1 = doc->NewElement("address"); eleStudent1->LinkEndChild(eleAddress1); XMLText *texAddress1 = doc->NewText("美國"); eleAddress1->LinkEndChild(texAddress1); if (XML_SUCCESS != doc->SaveFile("e:/tmp.xml")) { delete doc; return false; } doc->SaveFile("e:/tmp.xml"); delete doc; return true;}讀取
bool ReadXml(){ XMLDocument doc; if (XML_SUCCESS != doc.LoadFile("e:/tmp.xml")) //載入XML失敗 返回false { return false; } XMLElement *eleSchool = doc.RootElement(); //擷取根節點 if (eleSchool) { cout << "School:" << eleSchool->Attribute("name") << endl; XMLElement* eleClass = eleSchool->FirstChildElement("Class"); while (eleClass) { cout << " Class:" << eleClass->Attribute("name") << endl; XMLElement* eleStudent = eleClass->FirstChildElement("Student"); while (eleStudent) { cout << " Student:" << eleStudent->Attribute("name") << ", " << eleStudent->Attribute("number") << endl; XMLElement* eleEmail = eleStudent->FirstChildElement("email"); if (eleEmail) { cout << " Email:" << eleEmail->GetText() << endl; } XMLElement* eleAddress = eleStudent->FirstChildElement("address"); if (eleAddress) { cout << " Address:" << eleAddress->GetText() << endl; } eleStudent = eleStudent->NextSiblingElement("Student"); } eleClass = eleClass->NextSiblingElement(); } }}
XMLDocument::Parse( const char* p, size_t len )這個函數可以直接解析XML格式的字串FirstChildElement(const char* value=0):擷取第一個值為value的子節點,value預設值為空白,則返回第一個子節點。RootElement():擷取根節點,相當於FirstChildElement的空參數版本;const XMLAttribute* FirstAttribute() const:擷取第一個屬性值;XMLHandle NextSiblingElement( const char* _value=0 ) :獲得下一個節點。
下載地址
連結: http://pan.baidu.com/s/1pKDiU4V 密碼: ea72