Python 中的 ElementTree XML API

pythonserver side programmingprogramming

可扩展标记语言 (XML) 是一种与 HTML 非常相似的标记语言。它是一种可移植的语言,可用于处理少量到中等量的数据,而无需使用任何 SQL 数据库。

Python 的标准库包含 xml 包。此包具有 ElementTree 模块。这是一个简单而轻量级的 XML 处理器 API。

XML 是一种树状的分层数据格式。此模块中的 'ElementTree' 将整个 XML 文档视为一棵树。'Element' 类表示此树中的单个节点。对 XML 文件的读写操作在 ElementTree 级别完成。与单个 XML 元素及其子元素的交互在 Element 级别完成。

创建 XML 文件

树是元素的分层结构,从根开始,然后是其他元素。每个元素都是使用此模块的 Element() 函数创建的。

import xml.etree.ElementTree as et
e=et.Element('name')

每个元素都以标签和 attrib 属性为特征,后者是一个 dict 对象。对于 tree 的起始元素,attrib 是一个空字典

>>> root=xml.Element('employees')
>>> root.tag
'emploees'
>>> root.attrib
{}

您现在可以设置要在根元素下添加的一个或多个子元素。每个子元素可能有一个或多个子元素。使用 Subelement() 函数添加它们并定义其文本属性。

child=xml.Element("employee")
nm = xml.SubElement(child, "name")
nm.text = student.get('name')
age = xml.SubElement(child, "salary")
age.text = str(student.get('salary'))

每个子元素都通过 append() 函数添加到根元素,如下所示

root.append(child)

添加所需数量的子元素后,通过 elementTree() 函数构造一个树对象

tree = et.ElementTree(root)

整个树结构通过树对象的 write() 函数写入二进制文件

f = open('employees.xml', "wb")
tree.write(f)

在下面的例子中,树是由字典项列表构成的。每个字典项都包含描述学生数据结构的键值对。这样构建的树将写入 'myfile.xml'

import xml.etree.ElementTree as et
employees=[{'name':'aaa','age':21,'sal':5000},{'name':xyz,'age':22,'sal':6000}]
root = et.Element("employees")
for employee in employees:
child=xml.Element("employee")
root.append(child)
nm = xml.SubElement(child, "name")
nm.text = student.get('name')
age = xml.SubElement(child, "age")
age.text = str(student.get('age'))
sal=xml.SubElement(child, "sal")
sal.text=str(student.get('sal'))

tree = et.ElementTree(root)
with open('employees.xml', "wb") as fh:
tree.write(fh)

"myfile.xml"存储在当前工作目录中。

<employees><employee><name>aaa</name><age>21</age><sal>5000</sal></employee><employee><name>xyz</name><age>22</age><sal>60</sal></employee></employee>

解析 XML 文件

现在让我们读回上面示例中创建的 'myfile.xml'。为此,将使用 ElementTree 模块中的以下函数

ElementTree() 此函数被重载以将元素的层次结构读取到树对象中。

tree = et.ElementTree(file='students.xml')

getroot() 此函数返回树的根元素

root = tree.getroot()

getchildren() 此函数返回元素下一级子元素的列表。

children = root.getchildren()

在以下示例中,'myfile.xml' 的元​​素和子元素被解析为字典项列表。

import xml.etree.ElementTree as et
tree = et.ElementTree(file='employees.xml')
root = tree.getroot()
students = []
children = root.getchildren()
for child in children:
employee={}
pairs = child.getchildren()
for pair in pairs:
employee[pair.tag]=pair.text
employees.append(student)
print (employees)

输出

[{'name': 'aaa', 'age': '21', 'sal': '5000'}, {'name': 'xyz', 'age': '22', 'sal': '6000'}]

修改 XML 文件

我们将使用 Element 的 iter() 函数。它为给定标记创建一个树迭代器,以当前元素为根。迭代器按文档(深度优先)顺序迭代此元素及其下面的所有元素。

让我们为所有"标记"构建迭代器子元素并将每个 sal 标签的文本增加 100。

import xml.etree.ElementTree as et
tree = et.ElementTree(file='students.xml')
root = tree.getroot()
for x in root.iter('sal'):
s = int (x.text)
s = s+100
x.text=str(s)
with open("employees.xml", "wb") as fh:
tree.write(fh)

我们的 'employees.xml' 现在将进行相应的修改。

我们还可以使用 set() 来更新某个键的值。

x.set(marks, str(mark))

相关文章