從零開始學(xué)Python | 如何在 Python 中解析和修改 XML?
我們經(jīng)常需要解析用不同語言編寫的數(shù)據(jù)。Python提供了許多庫來解析或拆分用其他語言編寫的數(shù)據(jù)。在此 Python XML 解析器教程中,您將學(xué)習(xí)如何使用 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 parse() function
Using fromString() function
Finding Elements of Interest
讓我們開始吧。:)
什么是 XML?
XML 代表可擴展標記語言。它在外觀上類似于HTML,但 XML 用于數(shù)據(jù)表示,而 HTML 用于定義正在使用的數(shù)據(jù)。XML 專門設(shè)計用于在客戶端和服務(wù)器之間來回發(fā)送和接收數(shù)據(jù)??纯聪旅娴睦樱?/p>
例子:
xml version ="1.0" encoding ="UTF-8" ?>
上面的示例顯示了我命名為“Sample.xml”的文件的內(nèi)容,我將在此 Python XML 解析器教程中為所有即將推出的示例使用相同的內(nèi)容。
Python XML 解析模塊
Python允許使用兩個模塊解析這些 XML 文檔,即 xml.etree.ElementTree 模塊和 Minidom(最小 DOM 實現(xiàn))。解析意味著從文件中讀取信息并通過識別該特定 XML 文件的部分將其拆分為多個部分。讓我們進一步了解如何使用這些模塊來解析 XML 數(shù)據(jù)。
xml.etree.ElementTree 模塊:
該模塊幫助我們在樹結(jié)構(gòu)中格式化 XML 數(shù)據(jù),這是分層數(shù)據(jù)的最自然表示。元素類型允許在內(nèi)存中存儲分層數(shù)據(jù)結(jié)構(gòu),并具有以下屬性:
ElementTree 是一個包裝元素結(jié)構(gòu)并允許與 XML 相互轉(zhuǎn)換的類。現(xiàn)在讓我們嘗試使用python 模塊解析上述 XML 文件。
有兩種使用“ElementTree”模塊解析文件的方法。第一個是使用parse() 函數(shù),第二個是fromstring() 函數(shù)。parse() 函數(shù)解析作為文件提供的 XML 文檔,而 fromstring 解析作為字符串提供的 XML,即在三引號內(nèi)。
如前所述,該函數(shù)采用文件格式的 XML 來解析它??聪旅娴睦樱?/p>
例子:
import xml.etree.ElementTree as ET mytree = ET.parse('sample.xml') myroot = mytree.getroot()
如您所見,您需要做的第一件事是導(dǎo)入 xml.etree.ElementTree 模塊。然后, parse() 方法解析“Sample.xml”文件。getroot() 方法返回“Sample.xml”的根元素。
執(zhí)行上述代碼時,您不會看到返回的輸出,但不會出現(xiàn)表明代碼已成功執(zhí)行的錯誤。要檢查根元素,您可以簡單地使用 print 語句,如下所示:
例子:
import xml.etree.ElementTree as ET mytree = ET.parse('sample.xml') myroot = mytree.getroot() print(myroot)
輸出:? ??<元素'元數(shù)據(jù)'在0x033589F0>
上面的輸出表明我們的 XML 文檔中的根元素是“元數(shù)據(jù)”。
您還可以使用 fromstring() 函數(shù)來解析您的字符串數(shù)據(jù)。如果要執(zhí)行此操作,請將XML作為字符串傳遞給三引號,如下所示:
import xml.etree.ElementTree as ET data='''
上面的代碼將返回與前一個相同的輸出。請注意,用作字符串的 XML 文檔只是“Sample.xml”的一部分,我使用它來提高可見性。您也可以使用完整的 XML 文檔。
您還可以使用“標簽”對象檢索根標簽,如下所示:
例子:
print(myroot.tag)
輸出:??元數(shù)據(jù)
您還可以通過指定要在輸出中看到的字符串部分來對標簽字符串輸出進行切片。
例子:
print(myroot.tag[0:4])
輸出:??元
如前所述,標簽也可以具有字典屬性。要檢查根標記是否具有任何屬性,您可以使用“attrib”對象,如下所示:
例子:
print(myroot.attrib)
輸出:?{}
如您所見,輸出是一個空字典,因為我們的根標簽沒有屬性。
根也由子標簽組成。要檢索根標記的子項,您可以使用以下命令:
例子:
print(myroot[0].tag)
輸出:食物
現(xiàn)在,如果要檢索根的所有第一個子標簽,可以使用 for 循環(huán)迭代它,如下所示:
例子:
for x in myroot[0]: print(x.tag, x.attrib)
輸出:
item {'name': 'breakfast'}
價格 {}
描述 {}
卡路里 {}
返回的所有項目都是食物的子屬性和標簽。
要使用 ElementTree 將文本從 XML 中分離出來,您可以使用 text 屬性。例如,如果我想檢索有關(guān)第一個食品的所有信息,我應(yīng)該使用以下代碼:
例子:
for x in myroot[0]: print(x.text)
輸出:
懶懶地
$ 2.5
兩悠閑地與酸辣醬的
553
可以看到,第一項的文本信息已經(jīng)作為輸出返回了。現(xiàn)在,如果您想顯示具有特定價格的所有商品,您可以使用 get() 方法。此方法訪問元素的屬性。
例子:
for x in myroot.findall('food'): item =x.find('item').text price = x.find('price').text print(item, price)
輸出:
Idly .5
Paper Dosa .7
Upma .65
Bisi Bele Bath .50
Kesari Bath .95
上面的輸出顯示了所有必需的項目以及每個項目的價格。使用 ElementTree,您還可以修改 XML 文件。
可以操作 XML 文件中的元素。為此,您可以使用 set() 函數(shù)。讓我們首先看看如何向 XML 添加一些東西。
以下示例顯示了如何在項目描述中添加內(nèi)容。
例子:
for description in myroot.iter('description'): new_desc = str(description.text)+'wil be served' description.text = str(new_desc) description.set('updated', 'yes') mytree.write('new.xml')
write() 函數(shù)幫助創(chuàng)建一個新的 xml 文件并將更新的輸出寫入相同的文件。但是,您也可以使用相同的功能修改原始文件。執(zhí)行完上述代碼后,您將能夠看到已創(chuàng)建具有更新結(jié)果的新文件。
上圖顯示了對我們食品的修改描述。要添加新的子標簽,您可以使用 SubElement() 方法。例如,如果您想在第一項 Idly 中添加一個新的專業(yè)標簽,您可以執(zhí)行以下操作:
例子:
ET.SubElement(myroot[0], 'speciality') for x in myroot.iter('speciality'): new_desc = 'South Indian Special' x.text = str(new_desc) mytree.write('output5.xml')
輸出:
如您所見,在第一個食品標簽下添加了一個新標簽。通過在 [] 括號內(nèi)指定下標,您可以在任何地方添加標簽。現(xiàn)在讓我們看一下如何使用此模塊刪除項目。
要使用 ElementTree 刪除屬性或子元素,您可以使用 pop() 方法。此方法將刪除用戶不需要的所需屬性或元素。
例子:
myroot[0][0].attrib.pop('name', None) # create a new XML file with the results mytree.write('output5.xml')
輸出:
上圖顯示name屬性已從item標記中刪除。要刪除完整的標簽,您可以使用相同的 pop() 方法,如下所示:
例子:
myroot[0].remove(myroot[0][0]) mytree.write('output6.xml')
輸出:
輸出顯示食品標簽的第一個子元素已被刪除。如果要刪除所有標簽,可以使用 clear() 函數(shù),如下所示:
例子:
myroot[0].clear() mytree.write('output7.xml')
輸出:
執(zhí)行上述代碼時,food 標簽的第一個子標簽將被完全刪除,包括所有子標簽。到這里為止,我們一直在使用這個 Python XML 解析器教程中的 xml.etree.ElementTree 模塊?,F(xiàn)在讓我們看看如何使用 Minidom 解析 XML。
xml.dom.minidom模塊:
這個模塊基本上是由精通DOM(文檔對象模塊)的人使用的。DOM 應(yīng)用程序通常首先將 XML 解析為 DOM。在 xml.dom.minidom 中,這可以通過以下方式實現(xiàn):
使用 parse() 函數(shù):
第一種方法是通過提供要解析的 XML 文件作為參數(shù)來使用 parse() 函數(shù)。例如:
例子:
from xml.dom import minidom p1 = minidom.parse("sample.xml");
執(zhí)行此操作后,您將能夠拆分 XML 文件并獲取所需的數(shù)據(jù)。您還可以使用此函數(shù)解析打開的文件。
例子:
dat=open('sample.xml') p2=minidom.parse(dat)
在這種情況下,存儲打開文件的變量作為參數(shù)提供給解析函數(shù)。
使用 parseString() 方法:
當您想要提供要作為字符串解析的 XML 時,將使用此方法。
例子:
p3 = minidom.parseString('
您可以使用上述任何一種方法來解析 XML?,F(xiàn)在讓我們嘗試使用此模塊獲取數(shù)據(jù)。
在我的文件被解析后,如果我嘗試打印它,返回的輸出會顯示一條消息,表明存儲解析數(shù)據(jù)的變量是 DOM 對象。
例子:
dat=minidom.parse('sample.xml') print(dat)
輸出:
使用 GetElementByTagName 訪問元素:
例子:
tagname= dat.getElementsByTagName('item')[0] print(tagname)
如果我嘗試使用 GetElementByTagName 方法獲取第一個元素,我將看到以下輸出:
輸出:
請注意,只返回了一個輸出,因為為了方便我使用了 [0] 下標,這將在進一步的示例中刪除。
要訪問屬性的值,我必須按如下方式使用 value 屬性:
例子:
dat = minidom.parse('sample.xml') tagname= dat.getElementsByTagName('item') print(tagname[0].attributes['name'].value)
輸出:??早餐
要檢索這些標簽中存在的數(shù)據(jù),您可以使用 data 屬性,如下所示:
例子:
print(tagname[1].firstChild.data)
輸出:?紙 Dosa
您還可以使用value屬性拆分和檢索屬性的值。
例子:
print(items[1].attributes['name'].value)
輸出:?早餐
要打印出我們菜單中可用的所有項目,您可以遍歷這些項目并返回所有項目。
例子:
for x in items: print(x.firstChild.data)
輸出:
袖手旁觀
紙DOSA
UPMA
碧斯百麗沐浴
Kesari浴
要計算菜單上的項目數(shù),您可以使用 len() 函數(shù),如下所示:
例子:
print(len(items))
輸出指定我們的菜單包含 5 個項目。
這使我們結(jié)束了本 Python XML 解析器教程。我希望你已經(jīng)清楚地了解了一切。
Python XML
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。