<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
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 檔案,即 xml.etree.ElementTree 模組和 Minidom(最小 DOM 實現)。解析意味著從檔案中讀取資訊,並通過識別特定 XML 檔案的各個部分將其拆分為多個片段。讓我們進一步瞭解如何使用這些模組來解析 XML 資料。
該模組幫助我們將 XML 資料格式化為樹結構,這是分層資料的最自然表示。元素型別允許在記憶體中儲存分層資料結構,並具有以下屬性:
Property | Description |
---|---|
Tag | 一個字串,表示正在儲存的資料型別 |
Attributes | 由儲存為字典的許多屬性組成 |
Text String | 包含需要顯示的資訊的文字字串 |
Tail String | 如有必要,也可以有尾弦 |
Child Elements | 由許多儲存為序列的子元素組成 |
ElementTree 是一個封裝元素結構並允許與 XML 相互轉換的類,現在讓我們嘗試使用 python 模組解析上述 XML 檔案。
有兩種方法可以使用ElementTree
模組解析檔案。
第一個是使用 parse()
函數,第二個是 fromstring()
函數。 parse()
函數解析作為檔案提供的 XML 檔案,而 fromstring
在作為字串提供時解析 XML,即在三引號內。
如前所述,該函數採用檔案格式的 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()
函數來解析字串資料,我們需要將 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 檔案中的元素是可以被操縱的,為此,可以使用 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。
該模組基本上是由精通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>
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!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45