简介
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" 中。