ElementTree之Xml文檔處理


  • ElementTree: 表示整個XML層級結構
  • Element: 表示樹形結構中所有的父節點
  • SubElement: 表示樹形結構中所有的子節點

有些節點既是父節點,又是子節點

下面來看下這兩個類的定義及其提供的函數:

Element類

class xml.etree.ElementTree.Element(tag, attrib={}, **extra)

Element類對應的是樹形結構中的每個節點,對應的是XML文檔中的標簽對。我們上面提到過XML標簽有以下幾個特征,除了子標簽外都有相應的屬性與之對應:

標簽特征 對應的類屬性 數據類型
標簽名稱 tag 字符串
屬性 attrib 字典,所有屬性和屬性值的集合
標簽值 text 通常是字符串
與下一個標簽之間的值 tail 通常是字符串
子標簽 標簽的父子關系是在SubElement中指定的

關於Element.text和Element.tail屬性的說明

  • 它們可被用於保存於該Element相關的額外數據;
  • 它們的值通常是字符串,但是也可以是任何應用特定的對象類型;
  • 如果Element對象是由一個XML創建而來的,那么text屬性保存的是這個element的開始標簽與它的第一個子標簽或結束標簽之間的文本,或者是None;而tail保存的是這個element的結束標簽與下一個標簽之間的文件或None,可以看下面的例子。
<a><b>1<c>2<d/>3</c></b>4</a>
  • element a 的text和tail屬性值都是None;
  • element b 的text屬性值是1,tail屬性值是4;
  • element c 的text屬性值是2, tail屬性值是None;
  • element d 的text屬性值是None, tail的屬性值是3;
Element類中用於操作標簽屬性attrib的方法(類似於字典的方法):
# 以一個(name, value)的序列的形式返回該element所有屬性,且屬性在序列是隨機的 items() # 返回該element所有屬性的名稱列表,屬性名稱順序隨機 keys() # 獲取該element指定屬性key的值 get(key, default=None) # 設置該element指定屬性的值 set(key, value) # 重置當前element:刪除所有的 subelemnts、清空所有屬性、設置text和tail屬性值為None clear()
Element類中用於操作子標簽(subelement)的方法:
# 向最后添加一個子標簽
append(subelement)

# 向最后追加多個子標簽,subelements是一個Element序列;這是Python 3.2中新增的方法
extends(subelements)

# 像該element的指定位置插入一個subelement
insert(index, subelement) # 返回第一個與match匹配的subelement或None,match可以是一個tag名稱(標簽名稱),也可以是一個path find(match, namespaces=None) # 返回所有與match匹配的subelement列表或None,match可以是一個tag名稱(標簽名稱),也可以是一個path findall(match, namespaces=None) # 返回第一個與match匹配的subelement的text屬性值,如果匹配到的element沒有text屬性則返回一個空字符串,如果沒有匹配到subelement則返回default參數定義的值 findtext(match, default=None, namespaces=None) # Python 3.2開始已將該方法廢棄,請使用list(elem)或迭代 getchildren() # Python 3.2開始已將該方法廢棄,改用Element.iter() getiterator(tag=None) # 這是Python 3.2中新增的方法。以當前element作為根創建一個tree迭代器,該迭代器會議深度優先的方式迭代這個element及其下面的所有elements。如果tag不是None或'*',則只有tag值等於tag參數所指定值的element才會被這個迭代器返回;如果樹形結構在迭代過程中被修改,則結果為undefined。 iter(tag=None) # 這是Python 3.2中新增的方法。查找與match參數指定的tag名稱或path相匹配的所有subelements,返回一個以文檔順序產生所有匹配element的可迭代對象。 iterfind(match, namespaces=None) # 這是Python 3.2中新增的方法。創建一個迭代器,這個迭代器以文檔順序循環當前element和所有subelements並返回所有內部文本。 itertext() # 從當前element中移除指定的subelement remove(subelement)

SubElement類

SubElement(parent, tag, attrib={}, **extra)

parent參數表示父節點(標簽對),它應該是一個Element類的實例。SubElement的其他屬性和函數與Element相同。

ElementTree類

ElementTree表示的是整個element層級關系,並且該類還添加了一些對標准XML序列化和反序列化的額外支持。

class xml.etree.ElementTree.ElementTree(element=None, file=None)

element: 是一個Element實例,表示root element;

file: 是一個XML文件文成,如果該參數被給出,則會以該文件的內容初始化樹形層次結構;

下面是ElementTree提供的方法:

# 以指定的element實例替換當前tree的root element,相當於把整個XML的內容替換掉了 _setroot(element) # 返回當前樹形層級結構的root element getroot() # 與Element.find()功能相同,只是它是從樹形結構的root element開始查找 find(match, namespaces=None) # 與Element.findall()功能相同,只是它是從樹形結構的root element開始查找 findall(match, namespaces=None) # 與Element.findtext()功能相同,只是它是從樹形結構的root element開始查找 findtext(match, default=None, namespaces=None) # Python 3.2開始已將該方法廢棄,改用ElementTree.iter() getiterator(tag=None) # Python 3.2新增的方法。為當前root element創建並返回一個樹迭代器,該迭代器將會按順序循環這個樹形結構的中的所有與tag匹配的elements,默認返回所有elements iter(tag=None) # Python 3.2新增的方法。與Element.iterfind()功能相同,只是它是從樹形結構的root element開始查找 iterfind(match, namespaces=None) # 加載一個外部XML片斷到當前element樹並返回該XML片斷的root element。source是一個文件名稱或文件對象。parser是一個可選的parser實例,如果沒有給出該參數,將會使用標准的XMLParser解析器。 parse(source, parser=None) # 將當前element tree以XML形式寫入一個文件中。 # file 是一個文件名稱或一個以寫模式打開的文件對象 # encoding 用於指定輸出編碼 # xml_declaration 用於控制師傅將一個XML聲明也添加到文件中(False表示添加、True表示不添加、None表示只有編碼不是"US-ASCII"或"UTF-8"或"Unicode"時才添加) # default_namespace 設置默認的XML命名空間(“xmlns”) # method 可取值為"xml"、"html"和"text",默認為"xml" # short_empty_elements 是唯一一個關鍵字參數,是Python 3.4新增加的參數。它用於控制那些不包含任何內容的elements的格式,如果該參數值為Ture則這些標簽將會被輸出為一個單獨的自關閉標簽(如: <a/>),如果值為False則這些標簽將會被輸出為一個標簽對(如:<a></a>) write(file, encoding="us-ascii", xml_declaration=None, default_namespace=None, method="xml", *, short_empty_elements=True)

注意:

write()方法的輸出可以是一個字符串(str),可以可以是二進制(bytes)。這是受encoding參數控制的:

  • 如果encoding參數值為"unicode",則輸出是一個字符串;
  • 否則,輸出時二進制字節。
    如果file是一個(以可寫模式)打開的文件對象,這有可能會發生沖突。因此,我們需要確定不會嘗試將一個字符串寫入一個二進制流,反之亦然。

3. xml.etree.ElementTree模塊提供的函數

xml.etree.ElementTree模塊也直接提供了一些函數便於我們直接對XML進行操作,下面來介紹幾個常用的函數:

# 解析包含XML數據的字符串,返回一個Element實例 xml.etree.ElementTree.fromstring(text) # 生成並返回指定的Element實例對應的包含XML數據的字符串(encoding="unicode")或字節流 # 參數講解請參考上面的ElementTree類的write()方法 xml.etree.ElementTree.toString(element, encoding="us-ascii", method="xml", *, short_empty_elements=True) # 解析包含XML數據的文件名或文件對象,返回一個ElementTree實例 xml.etree.ElementTree.parse(source, parser=None) # 將XML數據以遞增的方式解析到元素樹中,並向用戶報告發生了什么(類似SAX的回調機制),最終返回一個提供(event, elem)對的迭代器(iterator)。 # source 是一個包含XML數據的文件名稱或文件對象 # events 是一個包含要報告的事件序列,這里支持的事件包括:"start"、"end"、"start-ns"、"end-ns"(“ns”事件用於獲取詳細的命名空間信息)。如果event參數被省略,則僅報告"end"事件。 # parser是一個可選的解析器實例,如果為給出則使用標准的XMLParser解析器 xml.etree.ElementTree.iterparse(source, events=None, parser=None)

關於xml.etree.ElementTree.iterparse()方法的說明:

  • 雖然它以遞增的方式構建元素樹,但是它仍然會鎖定對source的讀取操作。因此,它不適用於不能接受讀阻塞的應用。
  • 它只保證在發出一個“start”事件時,它已經看到了起始標簽(tag)的">"結束字符,因此此時它定義了atrrib屬性,但是text和tail屬性的內容在那一時刻是沒有被定義的(這同樣適用於子元素)。如果你需要一個完全填充的元素,請查找“end”事件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM