Python - XML 處理

你好,有抱負的程式設計師!今天,我們將深入探討使用 Python 處理 XML 的迷人世界。作為你友善的鄰居電腦科學老師,我很高興能引導你走過這段旅程。所以,拿起你最喜歡的飲料,我們開始吧!

Python - XML Processing

什麼是 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 數據的方法。三種主要方法為:

  1. SAX(Simple API for XML)
  2. DOM(Document Object Model)
  3. 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