python之自动生成解析xml的C++类

原创 2015年11月18日 22:12:27
##xml2parser.py
import os,sys,re
from string import Template

gHearFile = "cmd_parser"
gSrcFile = "cmd_parser"
gClassName = "CCParseXml"

class CObject(object):
    #@Consist
    def __init__(self):
        self._content = ""
        self._rootTag = ""
        self._subList = []
        self._gMap = {}
    #@Setter
    def setContent(self,content):
        self._content = content;
    def setRootTage(self,root):
        self._rootTag = root
    def addSubTag(self,subTag,value):
        self._subList.append(subTag)
        self._gMap[subTag] = value
    #@To
    def to_Def_List(self):
        ret = ""
        for tag in self._subList:
            s1 = "\tTiXmlNode * %s_Node;\n" % (tag)
            ret += s1
        return ret
    def to_Init_List(self):
        ret = ""
        for tag in self._subList:
            s1 = "\t%s_Node = NULL;\n" % (tag)
            ret += s1
        return ret
    def to_parse_subTags(self):
        nOrder = 1
        prefix = ""
        ret = ""
        for tag in self._subList:
            if (nOrder == 1):
                prefix = "\t\tif"
                nOrder += 1
            else:
                prefix = "\t\telse if"
            s1 = '%s( child->Type() == TiXmlNode::ELEMENT && !strcmp(child->Value(),"%s")){\n' % (prefix,tag)
            s1 += '\t\t\t%s_Node = (TiXmlNode *)child->FirstChild();\n' % (tag)
            s1 += '\t\t\tif(%s_Node != NULL && %s_Node->Value() != NULL)\n' % (tag,tag)
            s1 += '\t\t\t{\n'
            xVal = self._gMap[tag].strip()
            if re.match("\D",xVal):
                s1 += "\t\t\t\tstrcpy(msg->%s,%s_Node->Value());\n" % (tag,tag)
            else:
                value = "atoi(%s_Node->Value())" % (tag)
                s1 += '\t\t\t\tmsg->%s = %s;\n' % (tag ,value)
            s1 += '\t\t\t}\n'
            s1 += '\t\t}\n'
            ret += s1
        return ret

###########################################################################
#   write string to file.
###########################################################################
def writeToFile(str,fname):
    fp = open(fname,"w+")
    fp.write(str)
    fp.close()

###########################################################################
#   generate the header file.
###########################################################################
def saveHeadFile(varList):
    m_hContent = Template(
"""/******************************************************************************
@fileName    : ${FILE_NAME}.h
@description : define for the ${CLASS_NAME} class
******************************************************************************/
#ifndef ${FILE_NAME_UP}_H
#define ${FILE_NAME_UP}_H

#include "typedef.h"
#include "tinyxml.h"

class ${CLASS_NAME}
{
public:
    ${CLASS_NAME}(){}
    INT32 parseToMessage(PCHAR pXmlMsg ,Message * msg);
private:
    TiXmlDocument doc;
    iXmlElement *rootElem;
${VAR_LIST}};
#endif""")
    h_str = m_hContent.substitute(FILE_NAME = gHearFile,
                                  FILE_NAME_UP = gHearFile.upper(),
                                  CLASS_NAME = gClassName,
                                  VAR_LIST = varList)
    writeToFile(h_str,gHearFile + ".h")
    
###################################################################################################
#[OK]   generate the soruce file.
###################################################################################################
def saveBodyFile(varInitList,varParseList):
    m_bContent = Template(
"""/******************************************************************************
*
*  File name : ${FILE_NAME}.cpp
*  Title     : Implementation of the ${CLASS_NAME} class
*
******************************************************************************/
#include "${FILE_NAME}.h"
#include <string.h>

/******************************************************************************
*   @pXmlMsg    :   XML Content.
*   @msg        :   Store the Parsed Xml Result.
*   @Return     :   0 (OK) ,-1 (Fail)
******************************************************************************/
INT32 CCParseXml::parseToMessage(PCHAR pXmlMsg ,Message * msg){
    if(pXmlMsg == NULL || strlen(pXmlMsg) <= 0)
        return -1;
    if(rcvMsgSt == NULL)
        return -1;

${VAR_INIT_LIST}
    doc.Parse(pXmlMsg);
    rootElem = doc.RootElement();
    if(!rootElem){
        return -1;
    }
    for( const TiXmlNode* child = rootElem->FirstChild();child;child=child->NextSibling() ){
${VAR_PARSE_LIST}\t}
    return 0;
}
""")
    b_str = m_bContent.substitute(FILE_NAME=gSrcFile,
                                  CLASS_NAME=gClassName,
                                  VAR_INIT_LIST=varInitList,
                                  VAR_PARSE_LIST=varParseList)
    writeToFile(b_str,gSrcFile + ".cpp")

###################################################################################################
#[OK]   parse the xml
###################################################################################################
gObj = CObject()
def doParse(xml):
    global gObj
    cntList =open(xml,'r+').readlines()
    print "\n########################################################"
    for cnt in cntList:
        m = re.match(r'\s*<([^/><?]+)>\s*\n',cnt)
        if m:
            print "Root:\t%s" % (m.group(1))
            gObj.setRootTage(m.group(1))
            continue
        m = re.match(r'\s*<([^/><]+)>([^><]+)</([^/><]+)>',cnt)
        if m:
            print "Node:\t%s\t-> %s" % (m.group(1),m.group(2))
            gObj.addSubTag(m.group(1),m.group(2))
            continue
    print "########################################################"

###################################################################################################
#[OK]   The Main Logic
###################################################################################################
if len(sys.argv) < 2:
    print "Usage:\tdev.py test.xml"
else:
    doParse(sys.argv[1])
    vDefList = gObj.to_Def_List()
    vInitList = gObj.to_Init_List()
    vParseList = gObj.to_parse_subTags()
    saveHeadFile(vDefList)
    saveBodyFile(vInitList,vParseList)
##用法##
xml2parser.py person.xml

c++编写xml操作类(完整版)

         #include #include #include using namespace std; class xml; class nodeco...
  • sx1989827
  • sx1989827
  • 2010年11月09日 15:36
  • 2344

Python脚本自动生成相似的Cpp类

最近需要些写一些相似的Cpp类,使用python可以批量生成一些类似的类,代码如下: cpp生成report_cpp_generator.py #coding=utf-8 ''' Created ...
  • ts_zxc
  • ts_zxc
  • 2016年10月16日 22:49
  • 342

xml 转xsd->xsd转c,c++

fromhttp://blog.csdn.net/mynameiscloud/article/details/6616989 Trang 是一种命令行的可以XML生成XSD的工具,生成XML...
  • occupy8
  • occupy8
  • 2013年08月25日 13:08
  • 2192

推荐一个C++ xml配置解析工具类

推荐一个C++ xml配置解析工具类: https://github.com/halx99/xmldrv3
  • xyzzf
  • xyzzf
  • 2016年03月22日 13:05
  • 639

Linux下C++使用TinyXML解析XML文件

最近的由于项目需要解析XML文件,偷懒在网上找了一下开源的解析XML的源码学习了一下。发现一个上手很快,简单的开源解析XML的项目TinyXML。 TinyXML可以解析UTF-8编码格式的DOM标...
  • cscmaker
  • cscmaker
  • 2012年03月19日 19:22
  • 5047

用C++实现一个XML parser的必要工作。

考虑一个完整的XML Parser一般由几部分组成:必要组件:1. DOM 接口定义,以及DOM MODEL的实现。2. 一个XML词法分析器,用于将XML字符流转换成TOKEN流。3. 一个XML ...
  • dengyunze
  • dengyunze
  • 2005年04月14日 12:34
  • 3032

Python 利用 XSD 文件,解析 XML 文件

参考:http://blog.csdn.net/nohackcc/article/details/9770593   1. 用 generateDS 解析 XSD 文件,生成相应的 Python ...
  • hchaoh
  • hchaoh
  • 2017年04月06日 15:49
  • 800

XML的文件解析类————比较常用

 /// /// Author: jiangxiaoqiang /// public class XmlReader {   //=====================...
  • luoyanqing119
  • luoyanqing119
  • 2015年12月11日 16:16
  • 1070

XML生成java类

xml生成java类
  • a919334486
  • a919334486
  • 2017年05月18日 14:10
  • 305

python对XML的解析总结

转载了这么多的文章,终于可以写一点自己的东西了。初学Python不久,程序中不当之处还请各位看官不吝赐教。 本文中很多地方都是参考了其他人的博文,具体的也不甚清楚到底参考了哪些,在此仅列出一个大...
  • wanghuiqi2008
  • wanghuiqi2008
  • 2012年10月15日 18:58
  • 3212
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python之自动生成解析xml的C++类
举报原因:
原因补充:

(最多只允许输入30个字)