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)