zoukankan      html  css  js  c++  java
  • python3.5 修改 IIS WEB.CONFIG的相关方法

    #!/usr/bin/env python3.5
    # -*- coding:utf8 -*-
    from xml.etree.ElementTree import ElementTree,Element
    
    
    def read_xml(in_path):
        """
        读取并解析XML文件
        :param in_path: XML路径
        :return:
        """
        tree = ElementTree()
        tree.parse(in_path)
        return tree
    def write_xml(tree,out_path):
        """
        将XML文件写出
        :param tree:
        :param out_path:写出路径
        :return:
        """
        tree.write(out_path,encoding="utf-8",xml_declaration=True)
    def if_match(node,kv_map):
        """
        判断某个节点是否包含所有传入参数属性
        :param node: 节点
        :param kv_map: 属性及属性值组成的MAP
        :return:
        """
        for key in kv_map:
            if node.get(key) != kv_map.get(key):
                return False
            return True
    def find_nodes(tree,path):
        """
        查找某个路径匹配的所有节点
        :param tree:XML树
        :param path:节点路径
        :return:
        """
        return tree.findall(path)
    def get_node_by_keyvalue(nodelist,kv_map):
        """
        根据属性及属性值定位符合的节点,返回节点
        :param nodelist: 节点列表
        :param kv_map: 匹配属性及属性值MAP
        :return:
        """
        result_nodes =[]
        for node in nodelist:
            if if_match(node,kv_map):
                result_nodes.append(node)
        return result_nodes
    def change_node_properties(nodelist,kv_map,is_delete =False):
        """
        修改、增加、删除 节点的属性及属性值
        :param nodelist: 节点列表
        :param kv_map: 属性及属性值MAP
        :param is_delete:
        :return:
        """
        for node in nodelist:
            for key in kv_map:
                if is_delete:
                    if key in node.attrib:
                        del node.attrib[key]
                else:
                    node.set(key,kv_map.get(key))
    def change_node_text(nodelist,text,is_add=False,is_delete=False):
        """
        改变、增加、删除一个节点的文本
        :param nodelist: 节点列表
        :param text: 更新后的文本
        :param is_add:
        :param is_delete:
        :return:
        """
        for node in nodelist:
            if is_add:
                node.text += text
            elif is_delete:
                node.text = ""
            else:
                node.text = text
    def create_node(tag,property_map,content):
        """
        新造一个节点
        :param tag:节点标签
        :param property_map:属性及属性值MAP
        :param content: 节点闭合标签里的文件内容
        :return:新节点
        """
        element =Element(tag,property_map)
        element.text =content
        return element
    def add_child_node(nodelist,element):
        """
        给一个节点添加子节点
        :param nodelist: 节点列表
        :param element: 子节点
        :return:
        """
        for node in nodelist:
            node.append(element)
    def del_node_by_tagkeyvalue(nodelist,tag,kv_map):
        """
        同过属性及属性值定位一个节点,并删除之
        :param nodelist: 父节点列表
        :param tag: 子节点标签
        :param kv_map: 属性及属性值列表
        :return:
        """
        for parent_node in nodelist:
            childree = parent_node.getchildren()
            for child in childree:
                if child.tag == tag and if_match(child,kv_map):
                    parent_node.remove(child)
    def config_file_rw(file):
        """
        对XML配置文件进行修复以满足适应IIS
        :param file: 目标文件
        :return:
        """
        import re
        x =re.compile("<ns0:")
        y = re.compile("</ns0:")
        z = re.compile("xmlns:ns0")
        with open(file,"r",encoding="utf-8") as f:
            txt = f.readlines()
            for i, line in enumerate(txt):
                if x.search(line):
                    txt[i] = x.sub("<", line)
                elif y.search(line):
                    txt[i] = y.sub("</", line)
                elif z.search(line):
                    txt[i] = "<configuration>
    "
        with open(file,"w",encoding="utf-8") as fw:
            fw.writelines(txt)
            fw.close()
            print("配置文件%s,修改成功!"%file)
    if __name__ == "__main__":
        #1. 读取xml文件
        tree = read_xml("web.config")
        # 找到父节点
        print()
        nodes = find_nodes(tree, "connectionStrings/")
        # 通过属性准确定位子节点
        result_nodes =(get_node_by_keyvalue(nodes,{"name":"strConnection_HuaChenShiYou"}))
        # 修改节点属性
        change_node_properties(result_nodes,{"connectionString":"UwreW/Obe4fGk2CFW4uE6iZWaPAVn0nePXIrtNRApxEGLv6SHetFg6b%2BMLFhg9myAr2EI2b3FgHtKHOKVcjz5DPoV8%2BMAvpzqlEZP2JZqrVEofP3AulFUZbTLfmndYFRqIytlxSCeHr2A79EWHH9/xg0eSgsdvWd"})
        # #2. 属性修改
        #  #A. 找到父节点
        # nodes = find_nodes(tree, "processers/processer")
        #  #B. 通过属性准确定位子节点
        # result_nodes = get_node_by_keyvalue(nodes, {"name":"BProcesser"})
        #  #C. 修改节点属性
        # change_node_properties(result_nodes, {"age": "1"})
        #  #D. 删除节点属性
        # change_node_properties(result_nodes, {"value":""}, True)
        #
        # #3. 节点修改
        #  #A.新建节点
        # a = create_node("person", {"age":"15","money":"200000"}, "this is the firest content")
        #  #B.插入到父节点之下
        # add_child_node(result_nodes, a)
        #
        # #4. 删除节点
        #   #定位父节点
        # del_parent_nodes = find_nodes(tree, "processers/services/service")
        #   #准确定位子节点并删除之
        # target_del_node = del_node_by_tagkeyvalue(del_parent_nodes, "chain", {"sequency" : "chain1"})
        #
        # #5. 修改节点文本
        #   #定位节点
        # text_nodes = get_node_by_keyvalue(find_nodes(tree, "processers/services/service/chain"), {"sequency":"chain3"})
        # change_node_text(text_nodes, "new text")
        #
        # #6. 输出到结果文件
        write_xml(tree, "new.config")
        config_file_rw("new.config")
  • 相关阅读:
    linq 查询 过滤数据中某个值是否在数组中
    Nginx 摘要
    Unity调用外部摄像头,全屏显示摄像头画面
    Vuforia切换回识别场景后黑屏解决
    Unity3d通过脚本生成apk
    EF6 CodeFirst连接MySql 报nvarchar('max')错误解决办法
    UNITY_MATRIX_MVP和UnityObjectToClipPos
    Unity的stateMachineBehaviour
    U3D加载服务器上的assetbundle
    jquery解析xml,获取xml标签名
  • 原文地址:https://www.cnblogs.com/IPYQ/p/6281440.html
Copyright © 2011-2022 走看看