• 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")
  • 相关阅读:
    【Java】抽象类、接口
    【Java】封装、继承、多态
    【Java】WrapperClass 包装类
    【Java】步入OOP 面向对象
    【MySQL】Windows8.0.19 解压版 下载安装
    【Java】05 Variable 变量
    【MySQL】更改root根用户密码 和 SQLyog安装
    LOJ2033.[SDOI2016]生成魔咒 (后缀自动机)
    HDU4641 Kstring (后缀自动机+线段树合并)
    HDU5853 Jong Hyok and String (广义后缀自动机)
  • 原文地址:https://www.cnblogs.com/IPYQ/p/6281440.html
Copyright © 2020-2023  润新知