您的位置:首页 > 编程语言 > C语言/C++

Python3.5环境下使用generateDS解析xml文件生成C++头文件的方法

2017-01-05 13:54 986 查看


一、准备工作

1、安装python最新版本,这里以3.6版本为例,下载链接:https://www.python.org/downloads/release/python-360/,

在页面最下方有各种对应平台的安装包,根据自己的情况自行选择,然后根据网上其它介绍python安装的教程安装即

可。

2、安装generateDS最新版本,这里以2.24为例,下载链接:https://pypi.python.org/pypi/generateDS,注意页面上会

出现两个类型的版本,第一个“generateDS-2.24a0-py2.7.egg (md5)”,从名字可以知道,是基于Py2.7开发的,且类

型是Python Egg,说明是需要安装的。第二个generateDS-2.24a0.tar.gz (md5)“”,是基于python3.0以上版本开发

的,且类型是Source,说明无需安装,这里选择第二个进行下载,下载下来解压即可。

3、安装lxml。根据generateDS的文档说明,这个必须要的,而且从后面的使用过程中,也可以找到若没安装,在解

析时,会提示ImportError: No module named 'lxml'。lxml可以参考博客“windows 下安装 python lxml”,链接:
http://blog.csdn.net/zhaokuo719/article/details/8209496,这里将安装过程,摘录如下:
a、下载ez_setup.py文件,链接:http://download.csdn.net/detail/qq_28088659/9729502(注意:那个博客里的

下载链接提供的是python2.7版本的,我提供的是针对python3.0以上的)

b、运行改ez_setup.py文件。运行python的方式很多,控制台运行指令:python ez_setup.py

c、在系统PATH环境变量里面添加路径:如:E:\python3.6\Scripts(E:\python3.6 是python的安装路径)(注

意:这一步可以不进行,后面那一步提供完整的easy_install路径即可)

d、cmd执行:easy_install virtualenv   (或:E:\python3.6\Scripts\easy_install.exe virtualenv)

e、下载lxml  链接:https://pypi.python.org/pypi/lxml/3.7.1 下载完后是一个.whl后缀的文件,(注意:那个博客

提供的下载链接是lxml2.7,比较老的,用笔者提供的新的)

e、cmd 执行 E:\python3.6\Scripts\pip.exe install XXX\lxml-3.7.1-cp35-cp35m-win_amd64.whl   (注意:XXX是xml

文件的路径,此外那个博客使用的安装命令对于.whl的文件不适用,这里采用pip安装)

至此,所有的准备工作已全部完成........

二、解析XML文件

1、因为自己解析的时候,还是发现模板有的地方不明确。然后我就去看开发文档和别人学习FreeCAD的笔记,发现

里面有提到,FreeCAD会在Build过程中,将XML文件生成H和CPP文件。



2、于是我去GitHub上下了最新的FreeCAD的源码文件

3、通过查看App下对应的CMakeLists.txt,借助网上CMakeLists语法规则理解了一下代码的意思。发现里面有很多调

用generate_from_xml函数,于是猜想应该是这个东西导致XML文件生成H和CPP文件的。



4、可是APP的CMakeLists.txt没有关于generate_from_xml函数的具体内容。由于CMakeLists是顺序执行的,于是我

查看在它前面的代码,发现引用了一些其它地方的文件路径,特别是CMake的文件。



5、于是我去cMake目录下,把每个.cmake文件打开,然后查找generate_from_xml函数。最后发现只有在

FreeCadMacros.cmake文件里面找到了该函数。于是我就查看这个函数的实现,发现有一句代码跟xml有关系。



6、这句代码翻译成控制台命令就是:…\python.exe ...\src\Tools\gegerate.py –outputPath ….\文件输出路径  …

\XXX.xml。于是,打开gegerate.py的代码,在App目录下找了一个xml文件,在控制台直接键入这个命令,发现很多地

方报错,主要是FreeCAD的这个代码是Py2.7的,有的函数使用在Py3.0以上不兼容。主要有这么几类:

Print    ->     print()   

except Error, exp:    ->   expect Error as exp:

import template     ->   import 当前文件夹名. template as template

exec XX in DD,EE     ->   exec(XX, DD, EE)

7、解决这些因为版本的问题之后,还遗留一个代码本身的问题,错误提示为“。。。 no Flush”,我就把相应位置的

代码注释掉了。



8、接着就是从gegerate.py开始一点点,调试、读懂代码的过程了。从代码来看,gegerate.py是对处理对XML的处理

进行分流。分为XML含有Module元素和不含有Module元素的两种处理方式。这里我主要追踪了没有Module,因为大

部分的XML元素都没有Module元素。

9、gegerate.py的最后调用了…src\Tools\generateTemplates\templateClassPyExport.py文件,这个文件其实是一个

模板文件,因为它的下方很大一块,定义了头文件(TemplateHeader)、CPP文件(TemplateModule)和pyImp.CPP文件

(TemplateImplement)模板,然后,利用模板和XML文件,调用…\src\Tools\generateBase\generateTools.py进行解

析,并生成对应的H文件、CPP文件以及PyImpCPP文件(这个文件在代码里面是会先检查,如果没有,再创建的。)

10、在调试generateTools.py时,会发现生成的文件内容总是空的,网上查资料发现,



,于是添加了self.ouf.flush()代码。



至此、以上就是个人研究FreeCAD解析XML的工作机理的过程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: