TinyXML:一个优秀的C++ XML解析器

11 篇文章 0 订阅
读取和设置 xml 配置文件是最常用的操作,试用了几个 C++ XML 解析器,个人感觉 TinyXML 是使用起来最舒服的,因为它的 API 接口和 Java 的十分类似,面向对象性很好。
TinyXML 是一个开源的解析 XML 的解析库,能够用于 C++ ,能够在 Windows Linux 中编译。这个解析库的模型通过解析 XML 文件,然后在内存中生成 DOM 模型,从而让我们很方便的遍历这棵 XML 树。
DOM 模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。

如下是一个XML片段:

    < Persons >
        
< Person  ID ="1" >
            
< name > 周星星 </ name >
            
< age > 20 </ age >
        
</ Person >
        
< Person  ID ="2" >
            
< name > 白晶晶 </ name >
            
< age > 18 </ age >
        
</ Person >
    
</ Persons >

 

  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 的一些操作。
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);
}

 

http://www.loonglee.cn/post/44.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值