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++的路上走的更遠。