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:

  

    

    

    

   

 

  

    

    

    

    

      

     

程序代码:

#include"tinystr.h"

#include"tinyxml.h"

#include

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<ErrorDesc()<

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 !!!"<

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

你可能感兴趣的:(c++开发)