python XML ElementTree的增刪改查
阿新 • • 發佈:2021-01-20
轉自: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)