可扩展标记语言(XML)是一种类似于HTML的标记语言。它是便携式的,对于不使用任何SQL数据库处理少量到中等数据非常有用。
Python的标准库包含xml包。该软件包具有ElementTree模块。这是一个简单轻巧的XML处理器API。
XML是类似分层数据格式的树。此模块中的“ ElementTree”将整个XML文档视为一棵树。“ Element”类表示此树中的单个节点。对XML文件的读写操作是在ElementTree级别完成的。与单个XML元素及其子元素的交互在Element级别完成。
树是元素的层次结构,从根开始,然后是其他元素。每个元素都是使用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>
现在让我们回读上面示例中创建的“ 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'}]
我们将使用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))