Python - XML 處理
你好,有抱負的程式設計師!今天,我們將深入探討使用 Python 處理 XML 的迷人世界。作為你友善的鄰居電腦科學老師,我很高興能引導你走過這段旅程。所以,拿起你最喜歡的飲料,我們開始吧!
什麼是 XML?
在我們跳進編碼部分之前,讓我們先了解 XML 究竟是什麼。XML 是 eXtensible Markup Language(可擴展標記語言)的縮寫。它就像是 HTML 的表親,但目的不同。當 HTML 用於顯示數據時,XML 則用於存儲和傳輸數據。
想象 XML 是一種以樹狀結構組織資訊的方式。它使用標籤(如 <tag>
)來定義元素,類似於你如何在電腦上的資料夾中組織檔案。
這裡有一個 XML 的簡單例子:
<bookstore>
<book>
<title>哈利波特</title>
<author>J.K. 羅琳</author>
<year>1997</year>
</book>
</bookstore>
在這個例子中,我們有一個書店,其中包含有關一本書的資訊。該書有書名、作者和出版年份。很容易,對吧?
XML 解析器架構和 API
現在我們知道了 XML 是什麼,讓我們來談談如何使用 Python 處理它。Python 提供了多種解析(讀取和解释)XML 數據的方法。三種主要方法為:
- SAX(Simple API for XML)
- DOM(Document Object Model)
- ElementTree
這些每個都有自己的優勢和使用情況。讓我們一一來探索它們!
使用 SAX API 解析 XML
SAX,或稱 Simple API for XML,是一個事件驅動的解析器。它逐個序列讀取 XML 檔案,並在遇到元素、屬性或文字時觸發事件。
這是使用 SAX 的 Python 範例:
import xml.sax
class BookHandler(xml.sax.ContentHandler):
def startElement(self, name, attrs):
self.current = name
def characters(self, content):
if self.current == "title":
print(f"書名: {content}")
handler = BookHandler()
parser = xml.sax.make_parser()
parser.setContentHandler(handler)
parser.parse("books.xml")
在這個例子中,我們創建了一個 BookHandler
類別,定義了解析器遇到 XML 的不同部分時要做的事情。當它找到 "title" 元素時,它會列印出書名。
使用 DOM API 解析 XML
DOM,或稱 Document Object Model,將整個 XML 文檔載入記憶體,並以樹狀結構表示。這允許你輕鬆地導航和修改文檔。
這是你在 Python 中使用 DOM 的方式:
import xml.dom.minidom
doc = xml.dom.minidom.parse("books.xml")
titles = doc.getElementsByTagName("title")
for title in titles:
print(f"書名: {title.firstChild.data}")
這段代碼解析 XML 檔案,尋找所有的 "title" 元素,並列印出它們的內容。
ElementTree XML API
ElementTree 是一種更輕量級且更具 Python 風格的 XML 處理方式。由於其簡單性和效率,它常常是許多 Python 開發者的首選。
這是使用 ElementTree 的例子:
import xml.etree.ElementTree as ET
tree = ET.parse("books.xml")
root = tree.getroot()
for book in root.findall("book"):
title = book.find("title").text
print(f"書名: {title}")
這段代碼與我們之前的例子做相同的事,但方式更加直接。
創建一個 XML 檔案
現在,讓我們嘗試使用 ElementTree 從頭開始創建一個 XML 檔案:
import xml.etree.ElementTree as ET
root = ET.Element("bookstore")
book = ET.SubElement(root, "book")
ET.SubElement(book, "title").text = "銀河便車指南"
ET.SubElement(book, "author").text = "道格拉斯·亞當斯"
ET.SubElement(book, "year").text = "1979"
tree = ET.ElementTree(root)
tree.write("new_books.xml")
這個腳本創建了一個新的 XML 檔案,其中包含一個書籍條目。這就像是一個作者,但不是寫一本書,而是寫 XML!
解析一個 XML 檔案
我們已經看到了解析 XML 檔案的例子,但讓我們看一下使用 ElementTree 的更全面的例子:
import xml.etree.ElementTree as ET
tree = ET.parse("books.xml")
root = tree.getroot()
for book in root.findall("book"):
title = book.find("title").text
author = book.find("author").text
year = book.find("year").text
print(f"'{title}' 作者 {author},出版於 {year}")
這個腳本讀取我們的 XML 檔案,並列印出有關每本書的格式化資訊。
修改一個 XML 檔案
最後,讓我們修改一個現有的 XML 檔案:
import xml.etree.ElementTree as ET
tree = ET.parse("books.xml")
root = tree.getroot()
for book in root.findall("book"):
year = int(book.find("year").text)
if year < 2000:
book.find("year").text = str(year + 100)
tree.write("modified_books.xml")
這個腳本將 2000 年以前出版的書的出版日期增加了 100 年。這就像是我們把这些書送到未來一樣!
以下是總結我們使用的主要方法的表格:
方法 | 描述 |
---|---|
ET.parse() |
解析一個 XML 檔案 |
ET.Element() |
創建一個新的元素 |
ET.SubElement() |
創建一個新的子元素 |
element.findall() |
查找所有匹配的子元素 |
element.find() |
查找第一個匹配的子元素 |
element.text |
獲取或設置元素的文字 |
tree.write() |
將 XML 樹寫入一個檔案 |
就是這樣!我們已經涵蓋了 Python 中 XML 處理的基本知識。記住,熟練才能完美,所以不要害怕實驗這些例子。XML 一開始可能會有些令人生畏,但一旦你掌握了它,你會發現它是一個處理結構化數據的強大工具。
編程愉快,未來的 XML 大師! ??
Credits: Image by storyset