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")
原文地址:https://www.cnblogs.com/IPYQ/p/6281440.html