架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5528|回复: 2

[C++] 关于C++解析XML文件数据时基类转储派生类对象数据的技术...

[复制链接]
发表于 2019-1-16 09:22:59 | 显示全部楼层 |阅读模式
本帖最后由 夏天 于 2019-1-16 09:31 编辑

1、本文要解决的技术问题是什么?

解决现有技术中存在的用C++语言解析XML文档时,原XML文档中出现的基类标记派生类数据的情况下,按照常规解析方式根据基类类型只能解析基类数据而无法完整解析派生类数据的问题。


2、技术背景

在现有技术中,使用boost::serialization用基类指针转存派生类或者用BOOST_CLASS_EXPORT这个宏来实现。

现有的技术中存在的上述两种方案均是以抽象类机制为基础的,然而由于抽象类不能被实例化为可供使用的具体对象,从而造成XML文档中被声明为基类的对象无法被解析。本发明旨在确保无论是基类对象自身还是该基类对象标记的派生类对象的数据均能被正确解析并完整保存。


3、本文提供的技术方案

本文未采用抽象类机制,而是通过在基类被调用的类中引入基类指针,并将基类解析函数声明为虚函数,在解析环节通过基类指针去调用解析函数,从而应用多态来动态解析并存储数据,最终保证无论是基类对象还是从该基类派生出来的派生类对象的数据均能被存储在基类定义的指针中。
具体步骤:
第一步:C++编码设计出所有能够与待解析的XML文档中的数据标签一一对应的类,从顶层标签开始逐个标签解析XML数据;
第二步:每解析到一个标签,判断一下是否有其他标签将该标签作为基类继承,即该标签类型是否派生出别的标签类型;
第三步:如果判断出当前标签没有被作为基类继承,则按照正常解析步骤解析解析当前标签;
第四步:如果判断出当前标签被作为基类继承,则进一步判断该基类标签描述的内容从属于基类对象还是派生类对象;
第五步:如果判断出当前基类标签内容描述基类对象,则按照正常步骤解析解析当前标签;
第六步:如果判断出当前基类标签内容描述派生类对象,则修改代码按照新的解析方式解析:修改定义基类对象的上一级类型的数据结构,改为定义基类指针;修改基类解析函数,声明其为虚函数;
第七步:原来定义基类对象进行解析的地方,改为定义基类指针,根据标签内容描述的类型为其分配具体类型的内存,使用基类指针调用解析函数解析当前标签;
第八步:解析玩当前标签,判断是否还有待解析的标签;
第九步:如果判断出没有标签待解析,说明已经解析完毕,数据已经保存至C++类中对应XML文档最顶层标签的类中。
第十步:如果判断出还有标签未解析,按步骤二解析下一个标签。

附流程图

关于C++解析XML文件数据时基类转储派生类对象数据的技术...

关于C++解析XML文件数据时基类转储派生类对象数据的技术...

4、总结

C++引入基类指针,根据待解析的XML标签内容描述的是基类还是派生类,来为其赋值相应类型的对象,并且使用所定义的基类指针调用声明为虚函数的解析函数,来解析XML基类标签内容。这样,当XML基类标签描述基类对象数据时,根据C++的多态性会动态调用基类解析函数,基类标签描述的基类数据能得到正确解析与完好保存;当XML基类标签描述的是派生类对象数据时,根据C++的多态性会动态调用派生类解析函数,基类标签描述的派生类数据也能够得到正确解析与完好保存。





上一篇:安卓/PC的QQ协议分析教程
下一篇:魔灵召唤V4.1.8低调使用
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2019-1-16 09:26:40 | 显示全部楼层
流程图没了
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2019-1-16 09:31:49 | 显示全部楼层

流程图 补上了 你懂的
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-25 22:25

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表