首頁 > 軟體

Python操作XML檔案的使用指南

2022-09-14 22:02:22

什麼是 XML

XML 是可延伸標示語言,它在外觀上類似於 HTML,但 XML 用於資料表示,而 HTML 用於定義正在使用的資料。XML 專門設計用於在使用者端和伺服器之間來回傳送和接收資料。看看下面的例子:

<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<food>
    <item name="breakfast">Idly</item>
    <price>$2.5</price>
    <description>
   Two idly's with chutney
   </description>
    <calories>553</calories>
</food>
<food>
    <item name="breakfast">Paper Dosa</item>
    <price>$2.7</price>
    <description>
    Plain paper dosa with chutney
    </description>
    <calories>700</calories>
</food>
<food>
    <item name="breakfast">Upma</item>
    <price>$3.65</price>
    <description>
    Rava upma with bajji
    </description>
    <calories>600</calories>
</food>
<food>
    <item name="breakfast">Bisi Bele Bath</item>
    <price>$4.50</price>
    <description>
   Bisi Bele Bath with sev
    </description>
    <calories>400</calories>
</food>
<food>
    <item name="breakfast">Kesari Bath</item>
    <price>$1.95</price>
    <description>
    Sweet rava with saffron
    </description>
    <calories>950</calories>
</food>
</metadata>

上面的範例顯示了命名為“Sample.xml”的檔案的內容,後面的程式碼範例都會基於此 XML 例子來進行。

Python XML 解析模組

Python 允許使用兩個模組解析這些 XML 檔案,即 xml.etree.ElementTree 模組和 Minidom(最小 DOM 實現)。解析意味著從檔案中讀取資訊,並通過識別特定 XML 檔案的各個部分將其拆分為多個片段。讓我們進一步瞭解如何使用這些模組來解析 XML 資料。

xml.etree.ElementTree 模組

該模組幫助我們將 XML 資料格式化為樹結構,這是分層資料的最自然表示。元素型別允許在記憶體中儲存分層資料結構,並具有以下屬性:

PropertyDescription
Tag一個字串,表示正在儲存的資料型別
Attributes由儲存為字典的許多屬性組成
Text String包含需要顯示的資訊的文字字串
Tail String如有必要,也可以有尾弦
Child Elements由許多儲存為序列的子元素組成

ElementTree 是一個封裝元素結構並允許與 XML 相互轉換的類,現在讓我們嘗試使用 python 模組解析上述 XML 檔案。

有兩種方法可以使用ElementTree模組解析檔案。

第一個是使用 parse() 函數,第二個是 fromstring() 函數。 parse() 函數解析作為檔案提供的 XML 檔案,而 fromstring 在作為字串提供時解析 XML,即在三引號內。

使用 parse() 函數

如前所述,該函數採用檔案格式的 XML 進行解析,看看下面的例子:

import xml.etree.ElementTree as ET
mytree = ET.parse('sample.xml')
myroot = mytree.getroot()

我們需要做的第一件事是匯入 xml.etree.ElementTree 模組,然後使用 parse() 方法解析“Sample.xml”檔案,getroot() 方法返回“Sample.xml”的根元素。

當執行上述程式碼時,我們不會看到返回的輸出,但只要不會有錯誤就表明程式碼已成功執行。要檢查根元素,可以簡單地使用 print 語句,如下所示:

import xml.etree.ElementTree as ET
mytree = ET.parse('sample.xml')
myroot = mytree.getroot()
print(myroot)

Output:

<Element ‘metadata’ at 0x033589F0>

上面的輸出表明我們的 XML 檔案中的根元素是“後設資料”。

使用 fromstring() 函數

我們還可以使用 fromstring() 函數來解析字串資料,我們需要將 XML 作為三引號內的字串傳遞,如下所示:

import xml.etree.ElementTree as ET
data='''<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<food>
    <item name="breakfast">Idly</item>
    <price>$2.5</price>
    <description>
   Two idly's with chutney
   </description>
    <calories>553</calories>
</food>
</metadata>
'''
myroot = ET.fromstring(data)
#print(myroot)
print(myroot.tag)

上面的程式碼將返回與前一個相同的輸出,用作字串的 XML 檔案只是“Sample.xml”的一部分,已將其用於提高可見性,也可以使用完整的 XML 檔案。

還可以使用“標籤”物件檢索根標籤,如下所示:

print(myroot.tag)

Output:

metadata

還可以通過僅指定要在輸出中看到的字串部分來對標記字串輸出進行切片。

print(myroot.tag[0:4])

Output:

meta

如前所述,標籤也可以具有字典屬性。要檢查根標籤是否有任何屬性,您可以使用“attrib”物件,如下所示:

print(myroot.attrib)

Output:

{}

可以看到,輸出是一個空字典,因為我們的根標籤沒有屬性。

尋找感興趣的元素

根也由子標籤組成,要檢索根標籤的子標籤,可以使用以下命令:

print(myroot[0].tag)

Output:

food

現在,如果要檢索根的所有第一個子標記,可以使用 for 迴圈對其進行迭代,如下所示:

for x in myroot[0]:
     print(x.tag, x.attrib)

Output:

item {‘name’: ‘breakfast’}
price {}
description {}
calories {}

返回的所有專案都是食物的子屬性和標籤。

要使用 ElementTree 從 XML 中分離出文字,可以使用 text 屬性。 例如,如果想檢索關於第一個食物的所有資訊,應該使用以下程式碼:

for x in myroot[0]:
        print(x.text)

Output:

Idly
$2.5
Two idly’s with chutney
553

可以看出,第一項的文字資訊已作為輸出返回。現在如果想以特定價格顯示所有商品,可以使用 get() 方法,此方法存取元素的屬性。

for x in myroot.findall('food'):
    item =x.find('item').text
    price = x.find('price').text
    print(item, price)

Output:

Idly $2.5
Paper Dosa $2.7
Upma $3.65
Bisi Bele Bath $4.50
Kesari Bath $1.95

上面的輸出顯示了所有必需的專案以及每個專案的價格,使用 ElementTree,還可以修改 XML 檔案。

修改 XML 檔案

我們的 XML 檔案中的元素是可以被操縱的,為此,可以使用 set() 函數。讓我們先來看看如何在 XML 中新增一些東西。

新增到 XML:

以下範例顯示瞭如何在專案描述中新增內容。

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() 函數有助於建立一個新的 xml 檔案並將更新的輸出寫入該檔案,但是也可以使用相同的功能修改原始檔案。執行上述程式碼後,將能夠看到已建立一個包含更新結果的新檔案。

上圖顯示了我們食品專案的修改描述。要新增新的子標籤,可以使用 SubElement() 方法。例如,如果想在第一項 Idly 中新增新的專業標籤,可以執行以下操作:

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')

Output:

就像我們所見到的,在第一個食物標籤下新增了一個新標籤。可以通過在 [] 括號內指定下標來在任意位置新增標籤。

下面讓我們看看如何使用這個模組刪除專案。

從 XML 中刪除:

要使用 ElementTree 刪除屬性或子元素,可以使用 pop() 方法,此方法將刪除使用者不需要的所需屬性或元素。

myroot[0][0].attrib.pop('name', None)
 
# create a new XML file with the results
mytree.write('output5.xml')

Output:

上圖顯示 name 屬性已從 item 標記中刪除。要刪除完整的標籤,可以使用相同的 pop() 方法,如下所示:

myroot[0].remove(myroot[0][0])
mytree.write('output6.xml')

Output:

輸出顯示食品標籤的第一個子元素已被刪除。如果要刪除所有標籤,可以使用 clear() 函數,如下所示:

myroot[0].clear()
mytree.write('output7.xml')

執行上述程式碼時,food 標籤的第一個子標籤將被完全刪除,包括所有子標籤。

到目前為止,我們一直在使用 Python XML 解析器中的 xml.etree.ElementTree 模組。現在讓我們看看如何使用 Minidom 解析 XML。

xml.dom.minidom Module

該模組基本上是由精通DOM(檔案物件模組)的人使用的,DOM 應用程式通常首先將 XML 解析為 DOM。在 xml.dom.minidom 中,可以通過以下方式實現

使用 parse() 函數:

第一種方法是通過提供要解析的 XML 檔案作為引數來使用 parse()函數。例如:

from xml.dom import minidom
p1 = minidom.parse("sample.xml")

執行此操作後,將能夠拆分 XML 檔案並獲取所需的資料。還可以使用此函數解析開啟的檔案。

dat=open('sample.xml')
p2=minidom.parse(dat)

在這種情況下,儲存開啟檔案的變數作為引數提供給 parse 函數。

使用 parseString() 方法:

當我們想要提供要作為字串解析的 XML 時使用此方法。

p3 = minidom.parseString('<myxml>Using<empty/> parseString</myxml>')

可以使用上述任何方法解析 XML,現在讓我們嘗試使用這個模組獲取資料

尋找感興趣的元素

在我的檔案被解析後,如果我們嘗試列印它,返回的輸出會顯示一條訊息,即儲存解析資料的變數是 DOM 的物件。

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

Output:

<xml.dom.minidom.Document object at 0x03B5A308>

使用 GetElementsByTagName 存取元素

tagname= dat.getElementsByTagName('item')[0]
print(tagname)

如果我們嘗試使用 GetElementByTagName 方法獲取第一個元素,我將看到以下輸出:

<DOM Element: item at 0xc6bd00>

請注意,只返回了一個輸出,因為為方便起見,這裡使用了 [0] 下標,這將在進一步的範例中被刪除。

要存取屬性的值,我們將不得不使用 value 屬性,如下所示:

dat = minidom.parse('sample.xml')
tagname= dat.getElementsByTagName('item')
print(tagname[0].attributes['name'].value)

Output:

breakfast

要檢索這些標籤中存在的資料,可以使用 data 屬性,如下所示:

print(tagname[1].firstChild.data)

Output:

Paper Dosa

還可以使用 value 屬性拆分和檢索屬性的值。

print(items[1].attributes['name'].value)

Output:

breakfast

要列印出我們選單中的所有可用專案,可以遍歷這些專案並返回所有專案。

for x in items:
    print(x.firstChild.data)

Output:

Idly
Paper Dosa
Upma
Bisi Bele Bath
Kesari Bath

要計算我們選單上的專案數,可以使用 len() 函數,如下所示:

print(len(items))

Output:

5

輸出指定我們的選單包含 5 個專案。

到此這篇關於Python操作XML檔案的使用指南的文章就介紹到這了,更多相關Python操作XML內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com