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')
每个元素都以一个标签和一个 attrib 属性为特征,该属性是一个 dict 对象。对于树的起始元素,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() 函数。它为给定标签创建一个树迭代器,并以当前元素作为根。迭代器以文档(深度优先)顺序迭代此元素及其下方的所有元素。
让我们为所有“marks”子元素构建迭代器,并将每个 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))