簡體   English   中英

Python ElementTree:ElementTree與root元素

[英]Python ElementTree: ElementTree vs root Element

我對Python ElementTree API中的一些設計決策感到有些困惑 - 它們似乎有點武斷,所以我想澄清一下這些決定是否有一些邏輯背后,或者它們是否只是更多或者不那么特別。

因此,通常有兩種方法可能需要生成ElementTree - 一種是通過某種源流,如文件或其他I / O流。 這是通過parse()函數或ElementTree.parse()類方法實現的。

另一種方法是直接從字符串對象加載XML。 這可以通過fromstring()函數完成。

好,太棒了。 現在,我認為這些函數在它們返回的內容方面基本相同 - 它們之間的差異基本上是輸入源(一個接受文件或流對象,另一個接受普通字符串。)除了某種原因, parse()函數返回一個ElementTree對象,但fromstring()函數返回一個Element對象。 區別在於Element對象是XML樹的元素,而ElementTree對象是根元素周圍的“包裝器”,它提供了一些額外的功能。 您始終可以通過調用getroot()ElementTree對象獲取根元素。

不過,我很困惑為什么我們有這種區別。 為什么fromstring()直接返回根元素,但是parse()返回一個ElementTree對象? 這種區別背后有一些邏輯嗎?

這個古老的討論得出了一個很好的答案:

僅供記錄:Fredrik [ElementTree的創建者]實際上並不認為它是一個設計“怪癖”。 他認為它是針對不同的用例而設計的。 雖然parse()解析一個文件,該文件通常包含一個完整的文檔(在ET中表示為ElementTree對象),但是來自fromstring(),特別是'literal wrapper'XML()用於解析字符串,其中(大多數?)通常只有包含XML片段。 使用片段,您通常希望繼續執行將其插入另一個樹的操作,因此幾乎在所有情況下都需要頂級元素。

和:

為什么et.parse不是唯一的方法呢? 為什么要使用XML或fromstring?

用例。 XML()是fromstring()的別名,因為它的編寫方便(並且讀得很好)

section = XML('A to Z')section.append(paragraph)

用於源代碼中的XML文字。 fromstring()就在那里,因為當你想從你從任何來源獲得的字符串中解析一個片段時,很容易用這個函數來表達它,就像在

  el = fromstring(some_string) 

如果要從文件或類文件對象解析文檔,請使用parse()。 三個用例,三個功能。 從字符串解析文檔的第四個用例沒有自己的函數,因為編寫它是微不足道的

  tree = parse(BytesIO(some_byte_string)) 

我在評論中的思路與remram相同: parse采用文件位置或文件對象並保留該信息,以便它可以提供額外的實用程序,這非常有用。 如果解析沒有返回ET對象,那么您必須更好地跟蹤源和諸如此類的東西,以便手動將它們反饋到ET對象默認具有的輔助函數中。 與文件相比,字符串 - 按定義 - 沒有從它們附加的相同類型的信息,因此您不能為它們創建相同的實用程序(否則很可能是ET.parsefromstring()方法將返回一個ET對象)。

我懷疑這也是被稱為parse而不是ET.fromfile()的方法背后的邏輯:我希望從fromfilefromstring返回相同的對象類型,但不能說我希望從解析中得到相同的(它是自從我開始使用ET以來已經很長時間了,所以沒有辦法驗證,但這是我的感覺)。

關於這個問題,Remram提出了在Elements上放置實用程序方法,據我所知文檔,Elements在實現時非常均勻。 人們談論“根元素”,但樹的根部的元素在類屬性和方法方面與所有其他元素完全相同。 據我所知,Elements甚至不知道他們的父母是誰,這可能會支持這種統一性。 否則,可能會有更多代碼來實現“root”元素(沒有父元素)或重新父元素。 在我看來,Element類的簡單性對其有利。 所以對我來說似乎更好的做法是讓Elements基本上不知道它們之上的任何東西(它們的父級,它們來自哪個文件),所以在同一個樹(或類似的)中不能有任何關於4個不同輸出文件的元素的障礙。

當談到在代碼中實現模塊時,在我看來,腳本必須在某個時刻以某種方式將輸入識別為文件(否則它會嘗試將文件傳遞給fromstring )。 所以不應該出現這樣的解析的輸出應該是意外使得ElementTree的被認為是一個元素,作為這樣的處理(當然,除非, 解析無需程序員檢查,看看有什么解析做實施的情況下,這對我來說似乎是一個糟糕的習慣)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM