c/c++读写xml 数据

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++读写xml 数据_第1张图片

c/c++读写xml 数据_第2张图片

c/c++读写xml 数据_第3张图片

 

注意,在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文件编译规则。

 c/c++读写xml 数据_第4张图片

然后,编译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++程序。

关于解析库,还有很多其他的操作,大家可以看官方文档来学习。

 

注意:该解析库涉及的文件路径,不允许出现中文字符,否则会导致解析失败。

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