TinyXML解析xml文檔__網路編程

來源:互聯網
上載者:User

l        TinyXML簡介

TinyXML是目前非常流行的一款基於DOM模型的XML解析器,簡單易用且小巧玲瓏,非常適合儲存簡單資料,設定檔,對象序列化等資料量不是很大的操作,尤其適用於遊戲開發,在Nebula2,CEGUI等開源項目中都有使用。

 

名稱

提供者

是否支援驗證

備忘

Expat

SAX/Local

不清楚

Local指它還有一套自己訪問模型

LibXML2

SAX/DOM

驗證

 

TinyXml

DOM

 

XML4C

SAX/DOM

驗證

不過用了ICU,國際化似乎更好

Xerces-C

SAX/DOM

驗證

 

XML Booster

Local

不清楚

估計效率應該很高

 

 

l        關於DOM和SAX

DOM - Document Object Model

將整篇XML文檔一次性解析並讀入記憶體,儲存為一個對象供使用者訪問。

SAX - Simple API for XML

SAX的XML解析方式是基於事件回調的,解析器在每遇到一個XML元素時都會產生一個事件,並執行由使用者提供的處理函數。

 l        TinyXML類結構

 

[TiXmlBase] 所有TinyXML類的基類,儲存該結點或屬性在XML原文中的資訊。

[TiXmlAttribute] XML結點屬性,一個索引值對

[TiXmlNode] XML結點的基類,封裝了對XML文檔樹形結構進行操作和維護的方法

[TiXmlComment] XML注釋結點

[TiXmlDeclaration] XML聲明結點

[TiXmlDocument] XML文檔結點(一般為一篇XML文檔的根結點)

[TiXmlElement] XML結點

[TiXmlText] XML文本結點

[TiXmlUnknown] 含有未知標籤的XML結點

[TiXmlHandle] 封裝了一個結點的指標,在對該指標進行查詢時將自動進行null 指標交驗

[TiXmlVisitor] 遍曆器介面,描述了每個節點的處理方法,由子類實現

[TiXmlPrinter] Printer遍曆器

 l        讀取XML檔案

TiXmlDocument doc("test.xml");

doc.LoadFile("test.xml");

 l        寫入XML檔案

TiXmlDocument doc;

……

doc.SaveFile("test.xml");

 l        遍曆XML文檔

首先以FirstChild獲得第一個自節點,然後以NextSibling擷取下個兄弟節點;如此遞迴遍曆所有節點即可。

TiXmlNode::FirstChild();

TiXmlNode::NextSibling();

 l        構造XML文檔

將指定節點插入當前節點子節點隊列的末尾

TiXmlNode::LinkEndChild();

設定指定節點的屬性

TiXmlElement::SetAttribute();

TiXmlElement::SetDoubleAttribute();

 

TinyXML是個解析庫,主要由DOM模型類(TiXmlBase、TiXmlNode、TiXmlAttribute、TiXmlComment、TiXmlDeclaration、TiXmlElement、TiXmlText、TiXmlUnknown)和操作類(TiXmlHandler)構成。它由兩個標頭檔(.h檔案)和四個CPP檔案(.cpp檔案)構成,用的時候,只要將(tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp)匯入工程就可以用它的東西了。如果需要,可以將它做成自己的DLL來調用。舉個例子就可以說明一切。

對應的XML檔案:

<Persons>
    <Person ID="1">

        <name>phinecos</name>
        <age>22</age>
    </Person>
</Persons>

讀寫XML檔案的程式碼:

#include <iostream>#include "tinyxml.h"#include "tinystr.h"#include <string>#include <windows.h>#include <atlstr.h>using namespace std;CString GetAppPath(){//擷取應用程式根目錄    TCHAR modulePath[MAX_PATH];    GetModuleFileName(NULL, modulePath, MAX_PATH);    CString strModulePath(modulePath);    strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('//')));    return strModulePath;}bool CreateXmlFile(string& szFileName){//建立xml檔案,szFilePath為檔案儲存的路徑,若建立成功返回true,否則false    try     {        //建立一個XML的文檔對象。        TiXmlDocument *myDocument = new TiXmlDocument();        //建立一個根項目並串連。        TiXmlElement *RootElement = new TiXmlElement("Persons");        myDocument->LinkEndChild(RootElement);        //建立一個Person元素並串連。        TiXmlElement *PersonElement = new TiXmlElement("Person");        RootElement->LinkEndChild(PersonElement);        //設定Person元素的屬性。        PersonElement->SetAttribute("ID", "1");        //建立name元素、age元素並串連。        TiXmlElement *NameElement = new TiXmlElement("name");        TiXmlElement *AgeElement = new TiXmlElement("age");        PersonElement->LinkEndChild(NameElement);        PersonElement->LinkEndChild(AgeElement);        //設定name元素和age元素的內容並串連。        TiXmlText *NameContent = new TiXmlText("周星星");        TiXmlText *AgeContent = new TiXmlText("22");        NameElement->LinkEndChild(NameContent);        AgeElement->LinkEndChild(AgeContent);        CString appPath = GetAppPath();        string seperator = "//";        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;        myDocument->SaveFile(fullPath.c_str());//儲存到檔案    }    catch (string& e)     {        return false;    }    return true;}bool ReadXmlFile(string& szFileName){//讀取Xml檔案,並遍曆    try     {        CString appPath = GetAppPath();        string seperator = "//";        string fullPath = appPath.GetBuffer(0) +seperator+szFileName;        //建立一個XML的文檔對象。        TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());        myDocument->LoadFile();        //獲得根項目,即Persons。        TiXmlElement *RootElement = myDocument->RootElement();        //輸出根項目名稱,即輸出Persons。        cout << RootElement->Value() << endl;        //獲得第一個Person節點。        TiXmlElement *FirstPerson = RootElement->FirstChildElement();        //獲得第一個Person的name節點和age節點和ID屬性。        TiXmlElement *NameElement = FirstPerson->FirstChildElement();        TiXmlElement *AgeElement = NameElement->NextSiblingElement();        TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();        //輸出第一個Person的name內容,即周星星;age內容,即;ID屬性,即。        cout << NameElement->FirstChild()->Value() << endl;        cout << AgeElement->FirstChild()->Value() << endl;        cout << IDAttribute->Value()<< endl;    }    catch (string& e)    {        return false;    }    return true;}int main(){    string fileName = "info.xml";    CreateXmlFile(fileName);    ReadXmlFile(fileName);}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.