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))

更新於: 2019年7月30日

11K+ 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.