python 标准库之 xml.etree.ElementTree

简介

Element类型是一种灵活的容器对象,用于在内存中存储结构化数据。

[注意]xml.etree.ElementTree模块在应对恶意结构数据时显得并不安全。

每个element对象都具有以下属性:

1. tag:string对象,表示数据代表的种类。

2. attrib:dictionary对象,表示附有的属性。

3. text:string对象,表示element的内容。

4. tail:string对象,表示element闭合之后的尾迹。

5. 若干子元素(child elements)。

python 复制代码
<tag attrib1=1>text</tag>tail
  1     2        3         4

创建元素的方法有Element或者SubElement(),前者称作元素的构建函数(constructor),用以构建任一独存的元素;后者称作元素的制造函数(factory function),用以制造某一元素的子元素。

有了一串元素之后,使用ElementTree类来将其打包,把一串元素转换为xml文件或者从xml文件中解析出来。

若想加快速度,可以使用C语言编译的API xml.etree.cElementTree。


导入ElementTree

python 复制代码
from xml.etree import ElementTree as ET
python 复制代码
try:
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET

XML是中结构化数据形式,在ET中使用ElementTree代表整个XML文档,并视其为一棵树,Element代表这个文档树中的单个节点。


Element中的遍历与查询

python 复制代码
Element.iter(tag=None):遍历该Element所有后代,也可以指定tag进行遍历寻找。

Element.findall(path):查找当前元素下tag或path能够匹配的直系节点。

Element.find(path):查找当前元素下tag或path能够匹配的首个直系节点。

Element.text: 获取当前元素的text值。

Element.get(key, default=None):获取元素指定key对应的属性值,如果没有该属性,则返回default值。
Element对象
python 复制代码
class xml.etree.ElementTree.Element(tag, attrib={}, **extra)

  tag:string,元素代表的数据种类。
  text:string,元素的内容。
  tail:string,元素的尾形。
  attrib:dictionary,元素的属性字典。
  
  #针对属性的操作
  clear():清空元素的后代、属性、text和tail也设置为None。
  get(key, default=None):获取key对应的属性值,如该属性不存在则返回default值。
  items():根据属性字典返回一个列表,列表元素为(key, value)。
  keys():返回包含所有元素属性键的列表。
  set(key, value):设置新的属性键与值。

  #针对后代的操作
  append(subelement):添加直系子元素。
  extend(subelements):增加一串元素对象作为子元素。#python2.7新特性
  find(match):寻找第一个匹配子元素,匹配对象可以为tag或path。
  findall(match):寻找所有匹配子元素,匹配对象可以为tag或path。
  findtext(match):寻找第一个匹配子元素,返回其text值。匹配对象可以为tag或path。
  insert(index, element):在指定位置插入子元素。
  iter(tag=None):生成遍历当前元素所有后代或者给定tag的后代的迭代器。#python2.7新特性
  iterfind(match):根据tag或path查找所有的后代。
  itertext():遍历所有后代并返回text值。
  remove(subelement):删除子元素。

ElementTree对象
python 复制代码
class xml.etree.ElementTree.ElementTree(element=None, file=None)
element如果给定,则为新的ElementTree的根节点。  
setroot(element):用给定的element替换当前的根节点。慎用。

# 以下方法与Element类中同名方法近似,区别在于它们指定以根节点作为操作对象。  
find(match)  
findall(match)  
findtext(match, default=None)  
getroot():获取根节点  
iter(tag=None)
iterfind(match)  
parse(source, parser=None):装载xml对象,source可以为文件名或文件类型对象.  

write(file, encoding="us-ascii", xml_declaration=None, default_namespace=None,method="xml")

模块方法&案例

案例一

下面是一个简单的例子,展示了如何使用 xml.etree.ElementTree 模块来创建一个 XML 文档:

python 复制代码
import xml.etree.ElementTree as ET

# 创建根元素
root = ET.Element("root")

# 创建子元素
child1 = ET.SubElement(root, "child1")
child1.text = "This is child 1"

child2 = ET.SubElement(root, "child2")
child2.text = "This is child 2"

# 创建一个 XML 文档对象
tree = ET.ElementTree(root)

# 将 XML 写入文件
with open("example.xml", "wb") as f:
    tree.write(f)

案例二
python 复制代码
content = """
    <data>
        <country name="Liechtenstein" id ="123">
            <rank updated="yes">2</rank>
            <year>2023</year>
            <gdppc>141100</gdppc>
            <neighbor direction="E" name="Austria"/>
            <neighbor direction="w" name="Switzerland"/>
        </country>
        <country name="Panlma">
            <rank updated="yes">69</rank>
            <year>2026</year>
            <gdppc>13600</gdppc>
            <neighbor direction="w" name="Costa Rica"/>
            <neighbor direction="E" name="Colombia"/>
        </country>
    </data>
"""

root = ET.XML(content) # 加载数据
country_object = root.find("country") # 在加载的数据root里,寻找country标签
print(country_object.tag, country_object.attrib) # 打印 country_object 的标签名称和属性

year_object = country_object.find("year")
print(year_object.tag, year_object.attrib, year_object.text)


for child in root.iter("year"): # root.iter("year") 在root数据中,寻找所有year标签
    print(child.tag, child.attrib, child.text)


v1 = root.findall("country")  # 寻找所有 country 标签
print(v1)

v2 = root.find("country").find("year")  # 寻找第一个contry标签中的所有year标签
print(v2.text)


rank = root.find("country").find("rank")
rank.text = "flag{123456}"
rank.set('update', '2024-4-7')
print(rank.tag, rank.attrib, "\ndata:", rank.text)

tree = ET.ElementTree(root)
tree.write("my_directory/file_2.html", encoding="utf-8") # 保存操作!

构建xml文档
python 复制代码
# 构建xml文档

#第一种创建xml文件方式
from xml.etree import ElementTree as ET

# 创建根标签
root = ET.Element("home")

# 创建一标签
son1 = ET.Element("son", {'name': '小绿'})
# 创建二标签
son2 = ET.Element("son", {'name': '小白'})

# 在一标签内创建两个小标签
grandson1 = ET.Element('grandson', {'name': 'a'})
grandson2 = ET.Element('grandson', {'name': 'b'})
# 将两个孙子标签添加到 son1 标签内
son1.append(grandson1)
son1.append(grandson2)

# 把两个 son 标签添加到根节点内
root.append(son1)
root.append(son2)

# 创建 ElementTree 对象,并将根元素 root 传递给它
tree = ET.ElementTree(root)

# 写入文件
tree.write('my_directory/new_file.xml', encoding='utf-8', short_empty_elements=False)


"""输出:
<home>
    <son name="小绿">
        <grandson name="a"></grandson>
        <grandson name="b"></grandson>
    </son>
    <son name="小白"></son>
</home>

"""

python 复制代码
# 第二种创建xml文件方式
from xml.etree import ElementTree as ET

# 创建根节点
root = ET.Element("famliy")

# 创建大儿子
son1 = root.makeelement('son', {'name': '大儿子'})
# 创建小儿子
son2 = root.makeelement('son', {'name': '小儿子'})

# 在大儿子标签里面创建两个孙子
grandson1 = son1.makeelement('grandson', {'name': '大孙子'})
grandson2 = son1.makeelement('grandson', {'name': '小孙子'})
son1.append(grandson1)
son1.append(grandson2)

# 把儿子添加到跟节点
root.append(son1)
root.append(son2)

tree = ET.ElementTree(root)
tree.write('my_directory/new_file_2.xml', encoding='utf-8')

"""输出:
<famliy>
    <son name="大儿子">
        <grandson name="大孙子"/>
        <grandson name="小孙子"/>
    </son>
    <son name="小儿子"/>
</famliy>

"""
python 复制代码
from xml.etree import ElementTree as ET

root = ET.Element("famliy")

son1 = ET.SubElement(root, "son", attrib={"name": "son1"})
son2 = ET.SubElement(root, "son", attrib={"name": "son2"})

grandson1 = ET.SubElement(son1, "age", attrib={"name": "sun1"})
grandson1.text = "孙子"

et = ET.ElementTree(root) # 生成文档对象
et.write("my_directory/new_file_3.xml", encoding="utf-8")

"""输出:
<famliy>
    <son name="son1">
        <age name="sun1">孙子</age>
    </son>
    <son name="son2"/>
</famliy>
"""

构建一个 XML 文档,需要使用 xml.etree.ElementTree 模块中的类和函数。下面一个示例,演示了如何构建一个包含多个元素和属性的 XML 文档:

python 复制代码
import xml.etree.ElementTree as ET

# 创建根元素
root = ET.Element("root")

# 创建子元素并添加到根元素中
child1 = ET.SubElement(root, "child1")
child1.text = "This is child 1"
child1.set("attribute", "value1")

child2 = ET.SubElement(root, "child2")
child2.text = "This is child 2"

# 创建第二层子元素
subchild = ET.SubElement(child2, "subchild")
subchild.text = "This is a subchild"

# 创建一个 XML 文档对象
tree = ET.ElementTree(root)

# 将 XML 写入文件
with open("example.xml", "wb") as f:
    tree.write(f)

以上代码将创建如下结构的 XML 文档:

python 复制代码
<root>
    <child1 attribute="value1">This is child 1</child1>
    <child2>This is child 2<subchild>This is a subchild</subchild></child2>
</root>

这个例子中,我们创建了一个根元素 "root",并向其添加了两个子元素 "child1" 和 "child2" 。其中 "child1" 具有一个名为 "attribute" 的属性,并包含文本内容。 "child2" 具有一个名为 "subchild" 的子元素,并包含文本内容。最后,我们将整个 XML 文档写入到文件 "example.xml" 中。

相关推荐
苏言の狗1 分钟前
Pytorch中关于Tensor的操作
人工智能·pytorch·python·深度学习·机器学习
用余生去守护23 分钟前
python报错系列(16)--pyinstaller ????????
开发语言·python
数据小爬虫@28 分钟前
利用Python爬虫快速获取商品历史价格信息
开发语言·爬虫·python
是Dream呀1 小时前
Python从0到100(七十八):神经网络--从0开始搭建全连接网络和CNN网络
网络·python·神经网络
菜狗woc1 小时前
opencv-python的简单练习
人工智能·python·opencv
最爱番茄味1 小时前
Python实例之函数基础打卡篇
开发语言·python
程序猿000001号1 小时前
探索Python的pytest库:简化单元测试的艺术
python·单元测试·pytest
engchina2 小时前
如何在 Python 中忽略烦人的警告?
开发语言·人工智能·python
Dream_Snowar3 小时前
速通Python 第四节——函数
开发语言·python·算法
西猫雷婶3 小时前
python学opencv|读取图像(十四)BGR图像和HSV图像通道拆分
开发语言·python·opencv