c/c++读写xml 数据
xml数据格式是现在非常流行,也非常通用的一种数据格式,在很多地方都有应用,例如网页前台后台交互数据,就可以使用xml格式。
但由于c/c++原生态不支持xml的操作,导致用c/c++语言来操作xml是一件非常复杂的事情,好在很多人也在研究这个事,所以在网上可以搜到很多c/c++操作xml数据的第三方库,下面,我就来介绍其中一款:Xerces-C++ XML parser
该解析库可以在http://www.codesynthesis.com/下载,目前最高版本为4.0版(经测试,4.0版如果与MFC共用的话会导致XMLDocument类命名冲突),我们将使用3.1.1.0版,此版也能很好的支持vs2010平台下的开发。
下载并安装好解析库后,在项目中引入头文件和库文件即可。现在,我们以一个例子来说明操作。
假设你将解析库安装在 C:\ProgramFiles\CodeSynthesis XSD 3.3下。
1, 新建MFC对话框项目
2, 设置头文件及库目录
注意,在C/C++开发中,一般有两种版本,一个是调试版,即debug版,一种是发布版,即release版,在规范的库文件的名称里都会反映出来,xerces-c_3D.lib,后面有个D,意即调试版,没有的话,则为发布版。
你的工程是什么版本,就应该引入对应的版本。
至此,环境就搭建好了。
Xerces-C++XML parser 支持两种类型的解析库,一个是c++ parser mapping,一个是c++ tree mapping。这两种都能解析xml数据,但前一种的性能要高于后一种,是一种缓存中的模型解析,后一种是一般的解析库。
我们的任务并不需要高性能的数据解析和打包,使用c++ tree mapping足矣。
解析xml数据,就首先要对xml的格式有所了解,这里不扩展开来讲,有兴趣的可以在w3cshool上学习。
一般来说,原始的xml数据都是字符型的,在数据读入程序后,需要根据需求做转换,比如端口号,就需要将字符型数据转换为数字型,考虑到xml数据的一般性,xml数据定义组织扩展了它的内容,加入了xml架构定义,即xsd。在架构中,可以对xml的数据做一个描述,同时也对xml结构做一个限定和校验。
在vs平台上,提供了xsd的一个支持,可以利用xsd工具来生成,编辑xml数据。
接下来,我们就以一个例子来说明xsd的使用方法。
假设我们有一个需求,就是以xml格式存储人员信息。
姓名:张三 性别:男 年龄:30
姓名:李四 性别:女 年龄:31
姓名:王五 性别:男 年龄:32
注意,我们既可以从xml数据推导出xsd架构,也可以先设计xsd架构,再生成xml数据。
这个可以根据需求或者个人习惯来定。
以上,我们是先有了一个xml数据存储的需求,从这个数据,我们可以生成如下形式的xml数据:
接下来,我们在vs里新建一个xsd架构文件。IDE会生成很多预定义的参数,我们删除里面不用的参数,保留需要的,大概样子就如下所示:
xmlversion="1.0"encoding="utf-8"?>
<xs:schemaid="employee"xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexTypename="people_t">
<xs:attributename="name"type="xs:string">xs:attribute>
<xs:attributename="sex"type="xs:string">xs:attribute>
<xs:attributename="age"type="xs:int">xs:attribute>
xs:complexType>
<xs:complexTypename="employee_t">
<xs:sequence>
<xs:elementname="peolpe"type="people_t"minOccurs="0"maxOccurs="unbounded">xs:element>
xs:sequence>
xs:complexType>
<xs:elementname="employee"type="employee_t">xs:element>
xs:schema>
可以看到,在架构中,对变量的类型做了限定,这在之后利用解析类的时候,是非常方便的,因为通过解析类,拿到的数据,就是已经转好的数据。
接下来,我们就要利用Xerces-C++ XML parser提供的工具 xsd.exe(注意,不是vs自带的那个)来生成架构对应的类文件。
首先,我们应该告诉编译器,如何编译xsd文件,打开生成自定义管理器,勾选xsd文件编译规则。
然后,编译xsd文件,就会生成转换为对象的c++源代码。(安装了解析库后,才会有生成规则)
在这里,我们生成了employee.hxx,employee.cxx两个文件,将它们导入项目,即可操作xml数据。
由于用到了xsd架构,所以在打开xml数据之前,应该告诉解析器,xsd架构文件的位置,另外,解析器支持多种形式的数据解析,既可以是xml文件,也可以是URL连接。
string strData = "employee.xml"; // xml 数据
string strSchema = "employee.xsd"; // xml 架构
xml_schema::properties pp;
pp.no_namespace_schema_location(strSchema);
std::auto_ptr<employee_t>employee_set = employee(strData, 0, pp);
以上代码指定了xsd架构文件的位置,然后,以迭代的方式,读取数据:
std::auto_ptr<employee_t>employee_set = employee(strData, 0, pp);
employee_t::peolpe_iterator iter_employee_cur= employee_set->peolpe().begin();
employee_t::peolpe_iterator iter_employee_end= employee_set->peolpe().end();
while (iter_employee_end != iter_employee_cur)
{
people_tpeople(*iter_employee_cur);
CStringstrName = people.name().c_str();
CStringstrSex = people.sex().c_str();
int nAge = people.age();
iter_employee_cur++;
}
至此,xml 数据就进入了c/c++程序。
关于解析库,还有很多其他的操作,大家可以看官方文档来学习。
注意:该解析库涉及的文件路径,不允许出现中文字符,否则会导致解析失败。