ElementTree之Xml文檔處理

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

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

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

Element類

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

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

標籤特徵 對應的類屬性 數據類型
標籤名稱 tag 字符串
屬性 attrib 字典,全部屬性和屬性值的集合
標籤值 text 一般是字符串
與下一個標籤之間的值 tail 一般是字符串
子標籤 標籤的父子關係是在SubElement中指定的

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

  • 它們可被用於保存於該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相同。swift

ElementTree類

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

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

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

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

下面是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)

注意:spa

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」事件。
相關文章
相關標籤/搜索