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

Python之自动生成解析ini文件的C++类(基于libiniparser.a)

## 自动化生成解析ini的C++类 ## ini配置文件(config.ini) [Ku] IP=192.168.64.10 Type=16 Position=0-c AgentIP=1...
  • sauphy
  • sauphy
  • 2015年11月23日 20:14
  • 350

利用python操作android的xml资源文件,让其按照中文自动生成对应中文首字母加起来的名字,并且根据中文在java类里面替代对应的中文

都是国际化的过啊啊啊啊啊

根据帧图自动生成android 动画xml文件--python脚本

利用python脚本自动生成 android xml动画文件 import sys import os #imageName = sys.argv[1] #num = sys.argv[2] #ord...

自制工具:CSV代码生成器:自动生成CSV文件对应的C++实体类和字段类型解析代码

本文乃Siliphen原创,转载请注明出处:http://blog.csdn.net/stevenkylelee    更有开发效率地使用CSV文件 为了更有效率地使用CSV...

自制工具:CSV代码生成器:自动生成CSV文件对应的C++实体类和字段类型解析代码

本文乃Siliphen原创,转载请注明出处:http://blog.csdn.net/stevenkylelee    更有开发效率地使用CSV文件 为了更有效率地使用CSV文件,我制作了一个工具...

python之自动生成C++的父子双向继承关系

## toClass.py import os,sys,re import shutil,string #[OK] class CObject(object): def __init__(...
  • sauphy
  • sauphy
  • 2015年11月19日 00:00
  • 415
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python之自动生成解析xml的C++类
举报原因:
原因补充:

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