Python之使用ElementTree解析xml文件

1、xml文件格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<project name="项目名称">
    <!-- module 1:apk_upload_path必须在第一个子节点,branch代码覆盖main代码 -->
    <module name="模块名称">
        <apk_upload_path name="关键字">该模块apk上传到svn服务器的路径</apk_upload_path>
        
        <main name="主分支代码关键字">主分支代码svn路径</main>
        <branch name="子分支代码关键字">(如果存在)子分支代码svn路径</branch>
    </module>
    
    <!-- module 2 :apk_upload_path必须在第一个子节点,branch代码覆盖main代码 -->
    <module name="另一个模块名称">
        <apk_upload_path name="关键字">该模块apk上传到svn服务器的路径</apk_upload_path>
        
        <main name="主分支代码关键字">主分支代码svn路径</main>
        <branch name="子分支代码关键字">(如果存在)子分支代码svn路径</branch>
    </module>
</project>


2、直接上代码

#!/usr/bin/env python

# -*- coding: utf-8 -*-


import os
import sys


from xml.etree import ElementTree as ET


parent_path = "https://XX.XX.XX.XX:8443/svn/XXXX/JellyBean/BuildConfig/projects"






svn_username = "zhangm10129990"
svn_password = "zte.123456"




def print_node(node):
    '''打印结点基本信息'''
    print "=============================================="  
    print "node.attrib:%s" % node.attrib
    print "node.tag:%s" % node.tag  
    print "node.text:%s" % node.text




 
def load_prj_file(prj_name) :
    
    global project
    prj_file = 'projects/' + prj_name + '.xml'
    #prj_file = file_path + "/" + prj_name + '.xml'
    if os.path.isfile(prj_file):
        try:
            project = ET.parse(prj_file)
            return True
        except:
            print "error: cannot load project file %s.xml" %prj_name
            return False
    else:
        return False
        
def generate_shell_file(lines, modulename):
    file_operation = True
    filename = "projects/" + sys.argv[1] + "_" + sys.argv[2] + ".sh"
    #filename = sys.argv[3] + "/" + sys.argv[1] + "_" + sys.argv[2] + ".sh"
    sh_script = open(filename, 'w') #打开文件并清空
    try :
    sh_script.write("#!/bin/bash\n")
        sh_script.write("\n")
        sh_script.writelines(lines)
        sh_script.write("\n")
        sh_script.write("chmod 777 -R " + sys.argv[2] + "\n")
        #sh_script.write("cd " + modulename + "\n")
        #sh_script.write("mm" + "\n")
    except :
        print 'Error to Write to file %s' % filename
        file_operation = False
        pass
    finally :    
        sh_script.close()
        
    return file_operation


# @@@@@@@@ start run @@@@@@@@@@@@@@
if __name__=='__main__':
    if len(sys.argv) != 2:
        if load_prj_file(sys.argv[1]):
            rootval = project.getroot()
            #print_node(rootval)
            
            #待生成脚本的代码拷贝行
            lines_to_write = []
            is_param_right = False
            is_xml_right = False
            
            for child in rootval.getchildren():
                module_name = child.get('name')
                #print "#################### %s ###################" %module_name
                if module_name == sys.argv[2]:
                    is_param_right = True
                    #代码包含几个目录覆盖关系,至少一个
                    number_of_code_layer = len(child.getchildren())
                    #print number_of_code_layer
                    if number_of_code_layer >= 2:
                        lines_to_write.append("rm -fr " + module_name + "\n")
                        lines_to_write.append("rm -fr " + module_name + "[1-9]" + "\n")
                        lines_to_write.append("mkdir -m 777 " + module_name + "\n")
                        
                        index = 0
                        for code_branch in child.getchildren():
                            if index == 0 :   # apk upload path
                                index += 1
                                continue
                            #print_node(code_branch)
                            layer_path = code_branch.text
                            #print "layer_path : %s" % layer_path
                            if not layer_path is None :
                                if index == 1 :                  #主分支路径为非空
                                    is_xml_right = True
                                    
                                dest_path = module_name + str(index)
                                #lines_to_write.append("svn co --username " + svn_username + " --password " + " zte.123456 " + 
                                #                    layer_path + " " + dest_path + "\n")
                                lines_to_write.append("svn co " + layer_path + " " + dest_path + "\n")
                                index += 1
                                lines_to_write.append("cp -fr " + dest_path + "/* " + module_name + "\n")
                                #lines_to_write.append("rm -fr " + dest_path + "\n")
                
            #print lines_to_write
            
            if is_param_right == False :
                print 2 #2表示提供的模块名参数不正确
            else :
                if is_xml_right == False :
                    print 4  #表示代码提供的xml路径值有为空的可能
                else :    
                    if generate_shell_file(lines_to_write, sys.argv[2]) == False :
                        print 3 #表示生成shell文件失败
                    else :
                        print 0 #表示运行正常
            
        else:
            print 1 #表示解析xml文件失败
    else:
        print -1 #-1表示用户输入的参数个数不对
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值