1. 程式人生 > 其它 >python XML ElementTree的增刪改查

python XML ElementTree的增刪改查

轉自:https://www.cnblogs.com/steven223-z/p/11869109.html

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 = "\n" + 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)