摘要:我們經常需要解析用不同語言編寫的資料。Python提供了許多庫來解析或拆分用其他語言編寫的資料。在此 Python XML 解析器教程中,您将學習如何使用 Python 解析 XML。
本文分享自華為雲社群《從零開始學python | 如何在 Python 中解析和修改 XML?》,原文作者:Yuchuan。
我們經常需要解析用不同語言編寫的資料。Python提供了許多庫來解析或拆分用其他語言編寫的資料。在此 Python XML 解析器教程中,您将學習如何使用 Python 解析 XML。
以下是本教程中涵蓋的所有主題:
What is XML?
Python XML Parsing Modules
xml.etree.ElementTree Module
Using parse() function
Using fromstring() function
Finding Elements of Interest
Modifying XML files
Adding to XML
Deleting from XML
xml.dom.minidom Module
Using fromString() function
讓我們開始吧。:)
XML 代表可擴充标記語言。它在外觀上類似于HTML,但 XML 用于資料表示,而 HTML 用于定義正在使用的資料。XML 專門設計用于在用戶端和伺服器之間來回發送和接收資料。看看下面的例子:
例子:
上面的示例顯示了我命名為“Sample.xml”的檔案的内容,我将在此 Python XML 解析器教程中為所有即将推出的示例使用相同的内容。
Python允許使用兩個子產品解析這些 XML 文檔,即 xml.etree.ElementTree 子產品和 Minidom(最小 DOM 實作)。解析意味着從檔案中讀取資訊并通過識别該特定 XML 檔案的部分将其拆分為多個部分。讓我們進一步了解如何使用這些子產品來解析 XML 資料。
該子產品幫助我們在樹結構中格式化 XML 資料,這是分層資料的最自然表示。元素類型允許在記憶體中存儲分層資料結構,并具有以下屬性:

ElementTree 是一個包裝元素結構并允許與 XML 互相轉換的類。現在讓我們嘗試使用python 子產品解析上述 XML 檔案。
有兩種使用“ElementTree”子產品解析檔案的方法。第一個是使用parse() 函數,第二個是fromstring() 函數。parse() 函數解析作為檔案提供的 XML 文檔,而 fromstring 解析作為字元串提供的 XML,即在三引号内。
如前所述,該函數采用檔案格式的 XML 來解析它。看下面的例子:
如您所見,您需要做的第一件事是導入 xml.etree.ElementTree 子產品。然後, parse() 方法解析“Sample.xml”檔案。getroot() 方法傳回“Sample.xml”的根元素。
執行上述代碼時,您不會看到傳回的輸出,但不會出現表明代碼已成功執行的錯誤。要檢查根元素,您可以簡單地使用 print 語句,如下所示:
輸出: <元素'中繼資料'在0x033589F0>
上面的輸出表明我們的 XML 文檔中的根元素是“中繼資料”。
您還可以使用 fromstring() 函數來解析您的字元串資料。如果要執行此操作,請将XML作為字元串傳遞給三引号,如下所示:
上面的代碼将傳回與前一個相同的輸出。請注意,用作字元串的 XML 文檔隻是“Sample.xml”的一部分,我使用它來提高可見性。您也可以使用完整的 XML 文檔。
您還可以使用“标簽”對象檢索根标簽,如下所示:
輸出: 中繼資料
您還可以通過指定要在輸出中看到的字元串部分來對标簽字元串輸出進行切片。
輸出: 元
如前所述,标簽也可以具有字典屬性。要檢查根标記是否具有任何屬性,您可以使用“attrib”對象,如下所示:
輸出: {}
如您所見,輸出是一個空字典,因為我們的根标簽沒有屬性。
根也由子标簽組成。要檢索根标記的子項,您可以使用以下指令:
輸出:食物
現在,如果要檢索根的所有第一個子标簽,可以使用 for 循環疊代它,如下所示:
輸出:
item {'name': 'breakfast'}
價格 {}
描述 {}
卡路裡 {}
傳回的所有項目都是食物的子屬性和标簽。
要使用 ElementTree 将文本從 XML 中分離出來,您可以使用 text 屬性。例如,如果我想檢索有關第一個食品的所有資訊,我應該使用以下代碼:
懶懶地
$ 2.5
兩悠閑地與酸辣醬的
553
可以看到,第一項的文本資訊已經作為輸出傳回了。現在,如果您想顯示具有特定價格的所有商品,您可以使用 get() 方法。此方法通路元素的屬性。
Idly $2.5
Paper Dosa $2.7
Upma $3.65
Bisi Bele Bath $4.50
Kesari Bath $1.95
上面的輸出顯示了所有必需的項目以及每個項目的價格。使用 ElementTree,您還可以修改 XML 檔案。
可以操作 XML 檔案中的元素。為此,您可以使用 set() 函數。讓我們首先看看如何向 XML 添加一些東西。
以下示例顯示了如何在項目描述中添加内容。
write() 函數幫助建立一個新的 xml 檔案并将更新的輸出寫入相同的檔案。但是,您也可以使用相同的功能修改原始檔案。執行完上述代碼後,您将能夠看到已建立具有更新結果的新檔案。
上圖顯示了對我們食品的修改描述。要添加新的子标簽,您可以使用 SubElement() 方法。例如,如果您想在第一項 Idly 中添加一個新的專業标簽,您可以執行以下操作:
如您所見,在第一個食品标簽下添加了一個新标簽。通過在 [] 括号内指定下标,您可以在任何地方添加标簽。現在讓我們看一下如何使用此子產品删除項目。
要使用 ElementTree 删除屬性或子元素,您可以使用 pop() 方法。此方法将删除使用者不需要的所需屬性或元素。
上圖顯示name屬性已從item标記中删除。要删除完整的标簽,您可以使用相同的 pop() 方法,如下所示:
輸出顯示食品标簽的第一個子元素已被删除。如果要删除所有标簽,可以使用 clear() 函數,如下所示:
執行上述代碼時,food 标簽的第一個子标簽将被完全删除,包括所有子标簽。到這裡為止,我們一直在使用這個 Python XML 解析器教程中的 xml.etree.ElementTree 子產品。現在讓我們看看如何使用 Minidom 解析 XML。
這個子產品基本上是由精通DOM(文檔對象子產品)的人使用的。DOM 應用程式通常首先将 XML 解析為 DOM。在 xml.dom.minidom 中,這可以通過以下方式實作:
第一種方法是通過提供要解析的 XML 檔案作為參數來使用 parse() 函數。例如:
執行此操作後,您将能夠拆分 XML 檔案并擷取所需的資料。您還可以使用此函數解析打開的檔案。
在這種情況下,存儲打開檔案的變量作為參數提供給解析函數。
當您想要提供要作為字元串解析的 XML 時,将使用此方法。
您可以使用上述任何一種方法來解析 XML。現在讓我們嘗試使用此子產品擷取資料。
在我的檔案被解析後,如果我嘗試列印它,傳回的輸出會顯示一條消息,表明存儲解析資料的變量是 DOM 對象。
<xml.dom.minidom.Document 對象在 0x03B5A308>
使用 GetElementByTagName 通路元素:
如果我嘗試使用 GetElementByTagName 方法擷取第一個元素,我将看到以下輸出:
<DOM 元素:0xc6bd00 處的項目>
請注意,隻傳回了一個輸出,因為為了友善我使用了 [0] 下标,這将在進一步的示例中删除。
要通路屬性的值,我必須按如下方式使用 value 屬性:
輸出: 早餐
要檢索這些标簽中存在的資料,您可以使用 data 屬性,如下所示:
輸出: 紙 Dosa
您還可以使用value屬性拆分和檢索屬性的值。
輸出: 早餐
要列印出我們菜單中可用的所有項目,您可以周遊這些項目并傳回所有項目。
袖手旁觀
紙DOSA
UPMA
碧斯百麗沐浴
Kesari浴
要計算菜單上的項目數,您可以使用 len() 函數,如下所示:
輸出指定我們的菜單包含 5 個項目。
這使我們結束了本 Python XML 解析器教程。我希望你已經清楚地了解了一切。
點選關注,第一時間了解華為雲新鮮技術~