從零開始學(xué)Python | 如何在 Python 中解析和修改 XML?

      網(wǎng)友投稿 1045 2025-04-05

      我們經(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>

      例子:

      Idly .5 兩個 idly's with chutney < /description> 553 Paper Dosa .7 < 700 Upma .65 Rava upma with bajji 600 Bisi Bele Bath .50 Bisi Bele Bath with sev 400 Kesari Bath .95 藏紅花甜拉瓦 950

      上面的示例顯示了我命名為“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=''' Idly .5 Two idly's with chutney 553 ''' myroot = ET.fromstring(data) #print(myroot) print(myroot.tag)

      上面的代碼將返回與前一個相同的輸出。請注意,用作字符串的 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('Using parseString')

      您可以使用上述任何一種方法來解析 XML?,F(xiàn)在讓我們嘗試使用此模塊獲取數(shù)據(jù)。

      在我的文件被解析后,如果我嘗試打印它,返回的輸出會顯示一條消息,表明存儲解析數(shù)據(jù)的變量是 DOM 對象。

      例子:

      dat=minidom.parse('sample.xml') print(dat)

      輸出:

      使用 GetElementByTagName 訪問元素:

      例子:

      從零開始學(xué)python | 如何在 Python 中解析和修改 XML?

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

      上一篇:文件轉(zhuǎn)換加載失敗(為什么轉(zhuǎn)轉(zhuǎn)顯示加載失敗)
      下一篇:excel2007怎么畫斜杠(excel弄斜杠)
      相關(guān)文章
      亚洲国产精品嫩草影院| 亚洲成av人片一区二区三区| 欧美日韩亚洲精品| 亚洲国产精品xo在线观看| 亚洲另类激情综合偷自拍| 亚洲AV无码一区二区二三区软件| 亚洲日韩国产精品乱| 亚洲欧洲自拍拍偷精品 美利坚| 亚洲AV综合色区无码一二三区| 亚洲欧美国产国产综合一区| 亚洲欧美日韩国产精品一区| 亚洲日韩精品无码AV海量| 亚洲熟妇无码八V在线播放| 亚洲日韩av无码中文| 亚洲成a人片在线不卡一二三区| 亚洲大尺度无码无码专线一区| 亚洲AV无码国产精品永久一区| 国产AV无码专区亚洲AV蜜芽| 亚洲av无码专区青青草原| 无码天堂亚洲国产AV| 日本亚洲高清乱码中文在线观看| 亚洲AV成人一区二区三区观看| 看亚洲a级一级毛片| 亚洲精品tv久久久久| 中文字幕亚洲专区| 亚洲处破女AV日韩精品| 久久久久亚洲精品无码系列| 亚洲香蕉久久一区二区| 亚洲熟妇无码一区二区三区| 亚洲成AV人影片在线观看| 国产亚洲午夜精品| 中文字幕亚洲无线码| 久久精品亚洲中文字幕无码网站 | 亚洲人成色99999在线观看| 亚洲精品人成网线在线播放va| 日韩精品电影一区亚洲| 国产亚洲日韩一区二区三区| 亚洲AV无码专区亚洲AV伊甸园| 亚洲欧洲日产国码在线观看| 中文字幕亚洲情99在线| 国产精品亚洲专区无码WEB |