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)