【C++語言】讀取XML文件

C++讀取XML文件

     今天我們主要學習如何使用tinyXml類庫,輔助解析XML文件

     首先,我們先從網上下載tinyXml的源代碼,然後將其解壓,將解壓後的文件夾下的tinystr.h、tinyxml.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp和tinyxmlparser.cpp這六個文件拷貝到你的工程中去。然後在你程序頭部添加#include”tinystr.h”和#include”tinyxml.h ”。之後,我們就可以完美的使用tinyXml庫中所有的函數啦^_^...

     好啦,類庫添加完了,接下來我們來學習學習tinyXml類庫中的內容:

     在TinyXML中,根據XML的各種元素來類庫中定義了一些類:
            TiXmlBase:整個TinyXML模型的基類。
            TiXmlAttribute:對應於XML中的元素的屬性。
            TiXmlNode:對應於DOM結構中的節點。
            TiXmlComment:對應於XML中的註釋。
            TiXmlDeclaration:對應於XML中的申明部分,即<?versiong="1.0" ?>。
            TiXmlDocument:對應於XML的整個文檔。
            TiXmlElement:對應於XML的元素。
            TiXmlText:對應於XML的文字部分。
            TiXmlUnknown:對應於XML的未知部分。 
            TiXmlHandler:定義了針對XML的一些操作。

看了這些類後,熟悉XML文件格式的朋友們是不是感覺到xml文件的整個格式已經浮現在了腦海中呢。接下來我就給大家舉個小例子,幫助大家來學習如何使用這些類。

我們先創建一個xml文件(a.xml),然後解析xml,將解析到的內容輸入到另一個xml文件中去(b.xml)相當於拷貝了a.xml

a.Xml:

<HTML>

  <Header name="a" type="x" size="4" odd="0">

    <Field name="EMP-0" type="UINT32" ratio="1" link=""/>

    <Field name="EMP-1" type="UINT32" ratio="1" link=""/>

    <Field name="EMP-2" type="UINT32" ratio="1" link=""/>

   </Header>  

  <Body name="b" type="x" size="4" odd="0">

    <Field name="EMP-0" type="UINT32" ratio="1" link=""/>

    <Field name="EMP-1" type="UINT32" ratio="1" link=""/>

    <Field name="EMP-2" type="UINT32" ratio="1" link=""/>

    <Field name="EMP-3" type="UINT32" ratio="1" link=""/>

  </Body>    

</HTML>      

程序代碼:

#include"tinystr.h"

#include"tinyxml.h"

#include<iostream>

using namespace std;

#define SUCCESS 1

#define FAILED  0

int loadXml();

int main()

{

if(loadXml())

{getchar();return 1;}

getchar();

    return 0;

 

 

}

int loadXml()

{

//創建兩個個xml文檔對象,一個爲讀取,一個爲輸出

TiXmlDocument *inXml = new TiXmlDocument();

TiXmlDocument *outXml = new TiXmlDocument();

 

//加載xml文件

if(!inXml->LoadFile("a.xml"))  //判斷XML文件是否加載成功

{

cerr<<inXml->ErrorDesc()<<endl;

return 0;

}

//定義根節點,記錄xml文件的起始節點

TiXmlElement *inRoot = inXml->FirstChildElement(); //root指向xml文檔的第一個節點

inXml->Value();//獲取的值爲文件名

//定義根節點並連接,將輸入的根節點傳給輸出的根節點

TiXmlElement *outRoot = new TiXmlElement(inRoot->Value());

outXml->LinkEndChild(outRoot);

 

if(NULL == inRoot) //判斷文件是否有內容

{

cerr<<"No root element !!!"<<endl;

inXml->Clear();

return 0;

}

//循環遍歷每個節點

for(TiXmlElement *inElem = inRoot->FirstChildElement(); inElem != NULL; inElem = inElem->NextSiblingElement())

    {

TiXmlElement *outElem = new TiXmlElement(inElem->Value());

outRoot->LinkEndChild(outElem);

const char *name = inElem->Value();//獲取源文件中子節點的名字

outElem->SetValue(name);  //設置目的文件子節點的名字

//獲取源文件的屬性,設置目標文件的屬性

        const char *rName = inElem->Attribute("name");

outElem->SetAttribute("name",rName);

        const char *rType = inElem->Attribute("type");

outElem->SetAttribute("type",rType);

const char *rSize = inElem->Attribute("size");

outElem->SetAttribute("size",rSize);

const char *rOdd = inElem->Attribute("odd");

outElem->SetAttribute("odd",rOdd);

if(strcmp(name,"0"))

{

for(TiXmlElement *inChild = inElem->FirstChildElement();inChild!=NULL;inChild=inChild->NextSiblingElement())

{

TiXmlElement *outChild = new TiXmlElement(inChild->Value());

outElem->LinkEndChild(outChild);

const char *cName = inChild->Attribute("name");

outChild->SetAttribute("name",cName);

        const char *cType = inChild->Attribute("type");

outChild->SetAttribute("type",cType);

        const char *cRatio = inChild->Attribute("ratio");

outChild->SetAttribute("ratio",cRatio);

        const char *cLink = inChild->Attribute("link");

outChild->SetAttribute("link",cLink);

}

}

    }

outXml->SaveFile("b.xml");

inXml->Clear();

outXml->Clear();

return true;

}

 

輸出結果:

輸出文件b.xml和a.xml 的內容是一樣的。

 

嘿嘿,希望這篇學習心得對學習c++的朋友們有一點點的小幫助,然後大家一起在c++的路上走的更遠。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章