Python中的ElementTree XML API

可扩展标记语言(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')

每个元素的特征是标签和属性属性(即dict对象)。对于树的起始元素,attrib是一个空字典

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

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

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

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文件

我们将使用iter()Element的功能。它为以当前元素为根的给定标签创建树迭代器。迭代器以文档(深度优先)顺序遍历此元素及其下的所有元素。

让我们为所有“标记”子元素构建迭代器,并将每个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))