• Python xml 文件解析操作之 ElementTree 模块


    首先我们了解下 XML 格式

    • Element类型是一种灵活的容器对象,用于在内存中存储结构化数据。
    • 每个element对象都具有以下属性:
      • 1. tag 标签:string对象,表示数据代表的种类。  
      • 2. attrib 属性:dictionary对象,表示附有的属性。  
      • 3. text:string对象,表示element的内容。  
      • 4. tail:string对象,表示element闭合之后的尾迹。  
      • 5. 若干子元素(child elements)。  
    1. <tag attrib1=1>text</tag>tail
    2. 1 2 3 4

    Python 中处理 xml 文件有三种方式:

    • xml.dom:适合用于处理 DOM API。它能够将 XML 数据在内存中解析成一个树,然后通过对树的操作来操作 XML。但是这种方式由于将 XML 数据映射到内存中的树,导致比较慢,且消耗更多内存
    • xml.sax:Python 标准库包含 SAX 解析器,SAX 用事件驱动模型,通过在解析 XML 的过程中触发一个个的事件并调用用户定义的回调函数来处理 XML 文件。
    • xml.etree.ElementTree 就像一个轻量级的 DOM,具有方便友好的 API。代码可用性好,速度快,消耗内存少。
    • 注:因DOM需要将 XML 数据映射到内存中的树,一是比较慢,二是比较耗内存,而 SAX 流式读取 XML 文件,比较快,占用内存少,但需要用户实现回调函数(handler)

    Python 中 ElementTree 模块

    • ElementTree 是 Python 中内置的模块
    • 通过 import xml.etree.ElementTree 导入
    • ElementTree 模块中属性方法,如下
      • tag  获取节点名称
      • attrib  属性
      • text  文本
      • tail  附加文本
      • 可以通过索引取值操作获取子节点
    1. <?xml version="1.0"?>
    2. <data>
    3. <country1 name="Liechtenstein">
    4. <rank1 updated="yes">2</rank1>
    5. <year1>2008</year1>
    6. <gdppc1>141100</gdppc1>test
    7. <neighbor1 name="Austria" direction="E"/>
    8. <neighbor1 name="Switzerland" direction="W"/>
    9. </country1>
    10. <country2 name="Singapore">
    11. <rank2 updated="no">5</rank2>
    12. <year2>2011</year2>
    13. <gdppc2>59900</gdppc2>
    14. <neighbor2 name="Malaysia" direction="N"/>
    15. </country2>
    16. </data>
    1. import xml.etree.ElementTree as ET
    2. et = ET.parse("xmlfile")
    3. root = et.getroot()
    4. print(root.tag) # data
    5. print(root[0].tag) # country1
    6. print(root[1].tag) # country2
    7. print(root[0].attrib) # {'name': 'Liechtenstein'}
    8. print(root[0][1].text) # 2008
    9. print(root[0][2].tail) # test
    10. for r in root:
    11. print(r.tag)
    12. # 结果如下
    13. country1
    14. country2
    • ElementTree 模块中 ElementTree 类方法,如下
      • parse(source,parser=None)  将外部 XML 文件加载到元素树中。source 是一个文件名或文件对象。Parser 是一个可选的解析器实例。如果没有给出,则使用标准 XMLParse r解析器。返回一个 ElementTree 实例。
      • getroot()  返回此树的根元素
      • write(file, encoding="us-ascii", xml_declaration=None, default_namespace=None, method="xml", *, short_empty_elements=True)
        • 将元素树作为 XML 写入文件。 
        • file 是一个文件名,或一个为写入而打开的文件对象。
        • encoding 是输出编码(默认为 US-ASCII)。
        • xml_declaration 控制是否应该将 XML 声明添加到文件中。如果不是 US-ASCII 或 UTF-8 或 Unicode,则使用 False 表示从不,True 表示总是,None 仅表示 None(默认为 None)。
        • default_namespace 设置默认的 XML 名称空间(对于 “xmlns”)。
        • method 是 “xml”,“html” 或 “text”(默认是 “xml”)。
        • 仅限关键字的 short_empty_elements 参数控制不包含内容的元素的格式。
        • 如果为 True(默认值),则它们作为单个自闭标记发出,否则它们作为一对开始/结束标记发出。 
    • ElementTree 模块中 attrib 属性操作方法
      • clear()   重置一个元素。清除指定节点元素的所有属性
      • get(key, default=None)  获取名为 key 的元素属性。返回属性值,如果未找到该属性,则返回默认值
      • items()  以(名称、值)对序列的形式返回元素属性。属性以任意顺序返回。
      • keys()  以列表形式返回元素属性名称。名称以任意顺序返回。
      • set(key, value)  将元素上的属性 key 设置为 value。
    1. # xml 文件参考上面的
    2. import xml.etree.ElementTree as ET
    3. et = ET.parse("xmlfile")
    4. root = et.getroot()
    5. # attr = root[0].attrib # 获取到country1节点
    6. # attr.clear() # 清除country1节点中的所有属性,这仅仅是在内存中删除了,xml文件中的内容没有改变
    7. # et.write("xmlfile") # #将内存中的数据写入xml文件中,此时xml文件中的内容才发生改变
    8. rank1 = root[0][0]
    9. print(rank1.get("updated")) # yes -- get取出对于属性的值
    10. print(rank1.get("aaa")) # 当元素key不存在时返回None
    11. rank1.set("name", "Evan") # 给节点元素添加属性
    12. et.write("xmlfile")
    13. neighbor1 = root[0][3]
    14. print(neighbor1.keys()) # ['direction', 'name']
    15. print(neighbor1.items()) # [('direction', 'E'), ('name', 'Austria')]
  • 相关阅读:
    angular2网页前端执行流程
    2.4、编码与调制
    10、C++设计模式与泛型编程
    Spring6 当中的 Bean 循环依赖的详细处理方案+源码解析
    阿里巴巴Java面试题、笔试题(含答案)
    猿创征文|HCIE-Security Day61:应用行为控制技术
    gorm的自动化工具gen_已设置图床
    【正则】详解python正则表达式之re.match()与re.search()的用法
    攻防世界 re新手题 game
    英文科技论文写作与发表-精简写法和“Chinglish“(第4章)
  • 原文地址:https://blog.csdn.net/Mark_Zhengy/article/details/127693698