zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    第五周总结
    第四周总结
    第三周总结
    开课博客
    学习进度
    个人作业1-数组
    数组
    第一周考试总结
    团队个人冲刺第六天
    团队个人冲刺第五天
  • 原文地址:https://www.cnblogs.com/steven223-z/p/11869109.html
Copyright © 2011-2022 走看看