好友
阅读权限20
听众
最后登录1970-1-1
|
1、本文要解决的技术问题是什么?
解决现有技术中存在的用C++语言解析XML文档时,原XML文档中出现的基类标记派生类数据的情况下,按照常规解析方式根据基类类型只能解析基类数据而无法完整解析派生类数据的问题。
2、技术背景
在现有技术中,使用boost::serialization用基类指针转存派生类或者用BOOST_CLASS_EXPORT这个宏来实现。
现有的技术中存在的上述两种方案均是以抽象类机制为基础的,然而由于抽象类不能被实例化为可供使用的具体对象,从而造成XML文档中被声明为基类的对象无法被解析。本发明旨在确保无论是基类对象自身还是该基类对象标记的派生类对象的数据均能被正确解析并完整保存。
3、本文提供的技术方案
本文未采用抽象类机制,而是通过在基类被调用的类中引入基类指针,并将基类解析函数声明为虚函数,在解析环节通过基类指针去调用解析函数,从而应用多态来动态解析并存储数据,最终保证无论是基类对象还是从该基类派生出来的派生类对象的数据均能被存储在基类定义的指针中。
具体步骤:
第一步:C++编码设计出所有能够与待解析的XML文档中的数据标签一一对应的类,从顶层标签开始逐个标签解析XML数据;
第二步:每解析到一个标签,判断一下是否有其他标签将该标签作为基类继承,即该标签类型是否派生出别的标签类型;
第三步:如果判断出当前标签没有被作为基类继承,则按照正常解析步骤解析解析当前标签;
第四步:如果判断出当前标签被作为基类继承,则进一步判断该基类标签描述的内容从属于基类对象还是派生类对象;
第五步:如果判断出当前基类标签内容描述基类对象,则按照正常步骤解析解析当前标签;
第六步:如果判断出当前基类标签内容描述派生类对象,则修改代码按照新的解析方式解析:修改定义基类对象的上一级类型的数据结构,改为定义基类指针;修改基类解析函数,声明其为虚函数;
第七步:原来定义基类对象进行解析的地方,改为定义基类指针,根据标签内容描述的类型为其分配具体类型的内存,使用基类指针调用解析函数解析当前标签;
第八步:解析玩当前标签,判断是否还有待解析的标签;
第九步:如果判断出没有标签待解析,说明已经解析完毕,数据已经保存至C++类中对应XML文档最顶层标签的类中。
第十步:如果判断出还有标签未解析,按步骤二解析下一个标签。
附流程图
C++解析XML之基类转储派生类数据流程
4、总结
C++引入基类指针,根据待解析的XML标签内容描述的是基类还是派生类,来为其赋值相应类型的对象,并且使用所定义的基类指针调用声明为虚函数的解析函数,来解析XML基类标签内容。这样,当XML基类标签描述基类对象数据时,根据C++的多态性会动态调用基类解析函数,基类标签描述的基类数据能得到正确解析与完好保存;当XML基类标签描述的是派生类对象数据时,根据C++的多态性会动态调用派生类解析函数,基类标签描述的派生类数据也能够得到正确解析与完好保存。 |
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|