首页 > 编程语言 >Python xml 文件解析操作之 ElementTree 模块

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

时间:2022-11-04 17:24:04浏览次数:54  
标签:xml XML Python print ElementTree root 属性

首先我们了解下 XML 格式

  • Element类型是一种灵活的容器对象,用于在内存中存储结构化数据。
  • 每个element对象都具有以下属性:
    • 1. tag 标签:string对象,表示数据代表的种类。  
    • 2. attrib 属性:dictionary对象,表示附有的属性。  
    • 3. text:string对象,表示element的内容。  
    • 4. tail:string对象,表示element闭合之后的尾迹。  
    • 5. 若干子元素(child elements)。  
 <tag attrib1=1>text</tag>tail
   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  附加文本
    • 可以通过索引取值操作获取子节点
<?xml version="1.0"?>
<data>
    <country1 name="Liechtenstein">
        <rank1 updated="yes">2</rank1>
        <year1>2008</year1>
        <gdppc1>141100</gdppc1>test
        <neighbor1 name="Austria" direction="E"/>
        <neighbor1 name="Switzerland" direction="W"/>
    </country1>
    <country2 name="Singapore">
        <rank2 updated="no">5</rank2>
        <year2>2011</year2>
        <gdppc2>59900</gdppc2>
        <neighbor2 name="Malaysia" direction="N"/>
    </country2>
</data>
import xml.etree.ElementTree as ET

et = ET.parse("xmlfile")
root = et.getroot()
print(root.tag)     # data
print(root[0].tag)  # country1
print(root[1].tag)  # country2
print(root[0].attrib)  # {'name': 'Liechtenstein'}
print(root[0][1].text)  # 2008
print(root[0][2].tail)  # test

for r in root:
    print(r.tag)

# 结果如下
country1
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。
# xml 文件参考上面的

import xml.etree.ElementTree as ET

et = ET.parse("xmlfile")
root = et.getroot()
# attr = root[0].attrib   # 获取到country1节点
# attr.clear()    # 清除country1节点中的所有属性,这仅仅是在内存中删除了,xml文件中的内容没有改变
# et.write("xmlfile")     # #将内存中的数据写入xml文件中,此时xml文件中的内容才发生改变
rank1 = root[0][0]
print(rank1.get("updated"))    # yes  -- get取出对于属性的值
print(rank1.get("aaa"))    # 当元素key不存在时返回None
rank1.set("name", "Evan")   # 给节点元素添加属性
et.write("xmlfile")
neighbor1 = root[0][3]
print(neighbor1.keys())     # ['direction', 'name']
print(neighbor1.items())    # [('direction', 'E'), ('name', 'Austria')]

  

标签:xml,XML,Python,print,ElementTree,root,属性
From: https://www.cnblogs.com/ZhengYing0813/p/16858488.html

相关文章

  • python面试题
    将一个字符串逆序,不能使用反转函数求从10到100中能被3或5整除的数的和WhatisPython?WhatarethebenefitsofusingPython?WhatisPEP8?Whatispicklingandunpic......
  • 【python】后端文件流下载数据
    后台实现下载接口1.1通过文件流下载importosimporttimefromdjango.httpimportStreamingHttpResponsedefdownload_file_blob(name,url):""":param......
  • python 打包后运行提示 ModuleNotFoundError: No module named 'xxx'
    毫无疑问,是打的包有问题。目前见到的原因有三:1.pycharm开发环境的引用的包版本和外面的环境引用的包版本不一致。  处理方式:想办法让两个版本一致。  相关命......
  • 【Web开发】Python实现Web图表功能(pyecharts,Flask)
    <fontcolor=purpleface=华文行楷size="5">"柳丝榆荚自芳菲,不管桃飘与李飞;"1、简介APythonEchartsPlottingLibrary.ApacheEcharts是一个由百度开源的数据可视化......
  • Python常见加密解密算法
    Python爬虫常见加密解密算法urlencode加密简介:当url地址含有中文,或者参数有中文的时候,这个算是很正常了,但是把这样的url作为参数传递的时候(最常见的callback),需要把一些......
  • python 虚拟机框架-名字、作用域和名字空间
    python的虚拟机是python的核心,在.py源代码被编译器编译为字节码指令序列后,就将由python的虚拟机接手整个工作。python的虚拟机将从编译得到的PyCodeObject对象中依次读入每......
  • python操作日志
    importtimeimportosimportloggingcurrrent_path=os.path.dirname(__file__).rsplit("\\",1)[0]log_path=os.path.join(currrent_path,'../logs')classLo......
  • python 中提取文件的最后几列
     001、[root@PC1test]#lsa.txttest.py[root@PC1test]#cata.txt##测试文件001002003004005006007008009010011012013014015016......
  • python 中列出指定目录下的所有文件及目录
     001、>>>importos>>>os.listdir("/home/test")##结果返回的是列表['a.txt','b.txt','test1','test2','test3']>>> ......
  • [Python]解密pyc文件
    公司的pyc做了加密,前段时间研究了一下怎么解密. 最开始的思路是反汇编pypy的dll,找到import代码的实现,然后写一个解码的函数.但是对反编译的东西不熟悉,想要找到......