TinyXML:一个优秀的C++ XML解析器(转自Phinecos(洞庭散人))

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

读取和设置 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);
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值