python XML ElementTree的增删改查

import xml.etree.ElementTree as ET

"""
    ElementTree.write()       将构建的XML文档写入(更新)文件。
    Element.set(key, value)   添加和修改属性
    Element.text = ''         直接改变字段内容
    Element.remove(Element)   删除Element节点
    Element.append(Element)   为当前的Elment对象添加子对象
    ET.SubElement(Element,tag)创建子节点 
"""

#  增加自动缩进换行
def indent(elem, level=0):
    i = "
" + level*"  "
    if len(elem):
        if not elem.text or not elem.text.strip():
            elem.text = i + "  "
        if not elem.tail or not elem.tail.strip():
            elem.tail = i
        for elem in elem:
            indent(elem, level+1)
        if not elem.tail or not elem.tail.strip():
            elem.tail = i
    else:
        if level and (not elem.tail or not elem.tail.strip()):
            elem.tail = i
            

#------------新增XML----------

#创建根节点
a = ET.Element("student")
#创建子节点,并添加属性
b = ET.SubElement(a,"name")
b.attrib = {"NO.":"001"}
#添加数据
b.text = "张三"
#创建elementtree对象,写文件
indent(a,0)
tree = ET.ElementTree(a)
tree.write("writeXml.xml",encoding="utf-8")

#----------编辑XML--------
# 读取待修改文件
updateTree = ET.parse("writeXml.xml")
root = updateTree.getroot()

# --新增--

# 创建新节点并添加为root的子节点
newnode = ET.Element("name")
newnode.attrib = {"NO.":"003"}
newnode.text = "张三水"
root.append(newnode)

#---修改---

sub1 = root.findall("name")[2]
# --修改节点的属性
sub1.set("NO.","100")
# --修改节点内文本
sub1.text="陈真"

#----删除---

#--删除标签内文本
sub1.text = ""
#--删除标签的属性
del sub1.attrib["NO."]
#--删除一个节点
root.remove(sub1)


# 写回原文件
indent(root,0)
updateTree.write("writeXml.xml",encoding="utf-8", xml_declaration=True)

XML操作封装

def change_node_properties(nodelist, kv_map, is_delete=False):
    '''修改/增加 /删除 节点的属性及属性值
       nodelist: 节点列表
       kv_map:属性及属性值map'''
    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):
    '''改变/增加/删除一个节点的文本内容
       nodelist:节点列表
       text : 更新后的文本'''
    for node in nodelist:
        if is_add:
            node.text += text
        elif is_delete:
            node.text = ""
        else:
            node.text = text

def create_childnode(node,tag, property_map, content):
    '''新造一个子节点
       node:节点
       tag:子节点标签
       property_map:属性及属性值map
       content: 节点闭合标签里的文本内容
     '''
    element = ET.Element(tag, property_map)
    element.text = content
    node.append(element)

def del_node_by_tagkeyvalue(node, tag, kv_map):
    '''通过属性及属性值定位一个节点,并删除之
       node: 父节点
       tag:子节点标签
       kv_map: 属性及属性值列表'''
    for child in node:
        if child.tag == tag and child.attrib==kv_map:
            node.remove(child)
原文地址:https://www.cnblogs.com/steven223-z/p/11869109.html