xml.etree.ElementTree --- ElementTree XML API?

源代碼: Lib/xml/etree/ElementTree.py


xml.etree.ElementTree 模塊實(shí)現了一個(gè)簡(jiǎn)單高效的API,用于解析和創(chuàng )建XML數據。

在 3.3 版更改: 此模塊將在可能的情況下使用快速實(shí)現。

3.3 版后已移除: xml.etree.cElementTree 模塊已被棄用。

警告

xml.etree.ElementTree 模塊對于惡意構建的數據是不安全的。如果需要解析不可信或未經(jīng)身份驗證的數據,請參見(jiàn) XML 漏洞 。

教程?

這是一個(gè)使用 xml.etree.ElementTree (簡(jiǎn)稱(chēng) ET )的簡(jiǎn)短教程。目標是演示模塊的一些構建塊和基本概念。

XML 樹(shù)和元素?

XML 是一種繼承性的分層數據格式,最自然的表示方法是使用樹(shù)。 為此, ET 有兩個(gè)類(lèi) -- ElementTree 將整個(gè)XML文檔表示為一個(gè)樹(shù), Element 表示該樹(shù)中的單個(gè)節點(diǎn)。 與整個(gè)文檔的交互(讀寫(xiě)文件)通常在 ElementTree 級別完成。 與單個(gè) XML 元素及其子元素的交互是在 Element 級別完成的。

解析 XML?

我們將使用以下 XML 文檔作為本節的示例數據:

<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank>1</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>

可以通過(guò)從文件中讀取來(lái)導入此數據:

import xml.etree.ElementTree as ET
tree = ET.parse('country_data.xml')
root = tree.getroot()

或直接從字符串中解析:

root = ET.fromstring(country_data_as_string)

fromstring() 將 XML 從字符串直接解析為 Element ,該元素是已解析樹(shù)的根元素。 其他解析函數可能會(huì )創(chuàng )建一個(gè) ElementTree 。 確切信息請查閱文檔。

作為 Element , root 具有標簽和屬性字典:

>>>
>>> root.tag
'data'
>>> root.attrib
{}

還有可以迭代的子節點(diǎn):

>>>
>>> for child in root:
...     print(child.tag, child.attrib)
...
country {'name': 'Liechtenstein'}
country {'name': 'Singapore'}
country {'name': 'Panama'}

子級是可以嵌套的,我們可以通過(guò)索引訪(fǎng)問(wèn)特定的子級節點(diǎn):

>>>
>>> root[0][1].text
'2008'

備注

并非 XML 輸入的所有元素都將作為解析樹(shù)的元素結束。 目前,此模塊跳過(guò)輸入中的任何 XML 注釋、處理指令和文檔類(lèi)型聲明。 然而,使用這個(gè)模塊的 API 而不是從 XML 文本解析構建的樹(shù)可以包含注釋和處理指令,生成 XML 輸出時(shí)同樣包含這些注釋和處理指令。 可以通過(guò)將自定義 TreeBuilder 實(shí)例傳遞給 XMLParser 構造器來(lái)訪(fǎng)問(wèn)文檔類(lèi)型聲明。

用于非阻塞解析的拉取 API?

此模塊所提供了大多數解析函數都要求在返回任何結果之前一次性讀取整個(gè)文檔。 可以使用 XMLParser 并以增量方式添加數據,但這是在回調目標上調用方法的推送式 API。 有時(shí)用戶(hù)真正想要的是能夠以增量方式解析 XML 而無(wú)需阻塞操作,同時(shí)享受完整的已構造 Element 對象。

針對此需求的最強大工具是 XMLPullParser。 它不要求通過(guò)阻塞式讀取來(lái)獲得 XML 數據,而是通過(guò)執行 XMLPullParser.feed() 調用來(lái)增量式地添加數據。 要獲得已解析的 XML 元素,應調用 XMLPullParser.read_events()。 下面是一個(gè)示例:

>>>
>>> parser = ET.XMLPullParser(['start', 'end'])
>>> parser.feed('<mytag>sometext')
>>> list(parser.read_events())
[('start', <Element 'mytag' at 0x7fa66db2be58>)]
>>> parser.feed(' more text</mytag>')
>>> for event, elem in parser.read_events():
...     print(event)
...     print(elem.tag, 'text=', elem.text)
...
end

常見(jiàn)的用例是針對以非阻塞方式進(jìn)行的應用程序,其中 XML 是從套接字接收或從某些存儲設備增量式讀取的。 在這些用例中,阻塞式讀取是不可接受的。

因為其非常靈活,XMLPullParser 在更簡(jiǎn)單的用例中使用起來(lái)可能并不方便。 如果你不介意你的應用程序在讀取 XML 數據時(shí)造成阻塞但仍希望具有增量解析能力,可以考慮 iterparse()。 它在你讀取大型 XML 文檔并且不希望將它完全放去內存時(shí)會(huì )很適用。

查找感興趣的元素?

Element 有一些很有效的方法,可幫助遞歸遍歷其下的所有子樹(shù)(包括子級,子級的子級,等等)。例如 Element.iter():

>>>
>>> for neighbor in root.iter('neighbor'):
...     print(neighbor.attrib)
...
{'name': 'Austria', 'direction': 'E'}
{'name': 'Switzerland', 'direction': 'W'}
{'name': 'Malaysia', 'direction': 'N'}
{'name': 'Costa Rica', 'direction': 'W'}
{'name': 'Colombia', 'direction': 'E'}

Element.findall() 僅查找當前元素的直接子元素中帶有指定標簽的元素。 Element.find() 找帶有特定標簽的 第一個(gè) 子級,然后可以用 Element.text 訪(fǎng)問(wèn)元素的文本內容。 Element.get 訪(fǎng)問(wèn)元素的屬性:

>>>
>>> for country in root.findall('country'):
...     rank = country.find('rank').text
...     name = country.get('name')
...     print(name, rank)
...
Liechtenstein 1
Singapore 4
Panama 68

通過(guò)使用 XPath ,可以更精確地指定要查找的元素。

修改XML文件?

ElementTree 提供了一種構建XML文檔并將其寫(xiě)入文件的簡(jiǎn)單方法。調用 ElementTree.write() 方法就可以實(shí)現。

創(chuàng )建后可以直接操作 Element 對象。例如:使用 Element.text 修改文本字段,使用 Element.set() 方法添加和修改屬性,以及使用 Element.append() 添加新的子元素。

假設我們要為每個(gè)國家/地區的中添加一個(gè)排名,并在排名元素中添加一個(gè) updated 屬性:

>>>
>>> for rank in root.iter('rank'):
...     new_rank = int(rank.text) + 1
...     rank.text = str(new_rank)
...     rank.set('updated', 'yes')
...
>>> tree.write('output.xml')

生成的XML現在看起來(lái)像這樣:

<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank updated="yes">69</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>

可以使用 Element.remove() 刪除元素。假設我們要刪除排名高于50的所有國家/地區:

>>>
>>> for country in root.findall('country'):
...     # using root.findall() to avoid removal during traversal
...     rank = int(country.find('rank').text)
...     if rank > 50:
...         root.remove(country)
...
>>> tree.write('output.xml')

請注意在迭代時(shí)進(jìn)行并發(fā)修改可能會(huì )導致問(wèn)題,就像在迭代并修改 Python 列表或字典時(shí)那樣。 因此,這個(gè)示例先通過(guò) root.findall() 收集了所有匹配的元素,在此之后再對匹配項列表進(jìn)行迭代。

生成的XML現在看起來(lái)像這樣:

<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
</data>

構建 XML 文檔?

SubElement() 函數還提供了一種便捷方法來(lái)為給定元素創(chuàng )建新的子元素:

>>>
>>> a = ET.Element('a')
>>> b = ET.SubElement(a, 'b')
>>> c = ET.SubElement(a, 'c')
>>> d = ET.SubElement(c, 'd')
>>> ET.dump(a)
<a><b /><c><d /></c></a>

解析帶有命名空間的 XML?

如果 XML 輸入帶有 命名空間,則具有前綴的 prefix:sometag 形式的標記和屬性將被擴展為 {uri}sometag,其中 prefix 會(huì )被完整 URI 所替換。 并且,如果存在 默認命名空間,則完整 URI 會(huì )被添加到所有未加前綴的標記之前。

下面的 XML 示例包含兩個(gè)命名空間,一個(gè)具有前綴 "fictional" 而另一個(gè)則作為默認命名空間:

<?xml version="1.0"?>
<actors xmlns:fictional="http://characters.example.com"
        xmlns="http://people.example.com">
    <actor>
        <name>John Cleese</name>
        <fictional:character>Lancelot</fictional:character>
        <fictional:character>Archie Leach</fictional:character>
    </actor>
    <actor>
        <name>Eric Idle</name>
        <fictional:character>Sir Robin</fictional:character>
        <fictional:character>Gunther</fictional:character>
        <fictional:character>Commander Clement</fictional:character>
    </actor>
</actors>

搜索和探查這個(gè) XML 示例的一種方式是手動(dòng)為 find()findall() 的 xpath 中的每個(gè)標記或屬性添加 URI:

root = fromstring(xml_text)
for actor in root.findall('{http://people.example.com}actor'):
    name = actor.find('{http://people.example.com}name')
    print(name.text)
    for char in actor.findall('{http://characters.example.com}character'):
        print(' |-->', char.text)

一種更好的方式是搜索帶命名空間的 XML 示例創(chuàng )建一個(gè)字典來(lái)存放你自己的前綴并在搜索函數中使用它們:

ns = {'real_person': 'http://people.example.com',
      'role': 'http://characters.example.com'}

for actor in root.findall('real_person:actor', ns):
    name = actor.find('real_person:name', ns)
    print(name.text)
    for char in actor.findall('role:character', ns):
        print(' |-->', char.text)

這兩種方式都會(huì )輸出:

John Cleese
 |--> Lancelot
 |--> Archie Leach
Eric Idle
 |--> Sir Robin
 |--> Gunther
 |--> Commander Clement

XPath支持?

此模塊提供了對 XPath 表達式 的有限支持用于在樹(shù)中定位元素。 其目標是支持一個(gè)簡(jiǎn)化語(yǔ)法的較小子集;完整的 XPath 引擎超出了此模塊的適用范圍。

示例?

下面是一個(gè)演示此模塊的部分 XPath 功能的例子。 我們將使用來(lái)自 解析 XML 小節的 countrydata XML 文檔:

import xml.etree.ElementTree as ET

root = ET.fromstring(countrydata)

# Top-level elements
root.findall(".")

# All 'neighbor' grand-children of 'country' children of the top-level
# elements
root.findall("./country/neighbor")

# Nodes with name='Singapore' that have a 'year' child
root.findall(".//year/..[@name='Singapore']")

# 'year' nodes that are children of nodes with name='Singapore'
root.findall(".//*[@name='Singapore']/year")

# All 'neighbor' nodes that are the second child of their parent
root.findall(".//neighbor[2]")

對于帶有命名空間的 XML,應使用通常的限定 {namespace}tag 標記法:

# All dublin-core "title" tags in the document
root.findall(".//{http://purl.org/dc/elements/1.1/}title")

支持的XPath語(yǔ)法?

語(yǔ)法

含意

tag

選擇具有給定標記的所有子元素。 例如,spam 是選擇名為 spam 的所有子元素,而 spam/egg 是在名為 spam 的子元素中選擇所有名為 egg 的孫元素,{*}spam 是在任意(或無(wú))命名空間中選擇名為 spam 的標記,而 {}* 是只選擇不在一個(gè)命名空間中的標記。

在 3.8 版更改: 增加了對星號通配符的支持。

*

選擇所有子元素,包括注釋和處理說(shuō)明。例如 */egg 選擇所有名為 egg 的孫元素。

.

選擇當前節點(diǎn)。這在路徑的開(kāi)頭非常有用,用于指示它是相對路徑。

//

選擇所有子元素 在當前元素的所有下級中選擇所有下級元素。 例如,.//egg 是在整個(gè)樹(shù)中選擇所有 egg 元素。

..

選擇父元素。 如果路徑試圖前往起始元素的上級(元素的 find 被調用)則返回 None。

[@attrib]

選擇具有給定屬性的所有元素。

[@attrib='value']

選擇給定屬性具有給定值的所有元素。該值不能包含引號。

[@attrib!='value']

選擇給定屬性不具有給定值的所有元素。 該值不能包含引號。

3.10 新版功能.

[tag]

選擇所有包含 tag 子元素的元素。只支持直系子元素。

[.='text']

選擇完整文本內容等于 text 的所有元素(包括后代)。

3.7 新版功能.

[.!='text']

選擇完整文本內容包括其下級內容不等于給定的 text 的所有元素。

3.10 新版功能.

[tag='text']

選擇所有包含名為 tag 的子元素的元素,這些子元素(包括后代)的完整文本內容等于給定的 text 。

[tag!='text']

選擇具有名為 tag 的子元素的所有元素,這些子元素包括其下級元素的完整文本內容不等于給定的 text。

3.10 新版功能.

[position]

選擇位于給定位置的所有元素。 位置可以是一個(gè)整數 (1 表示首位),表達式 last() (表示末位),或者相對于末位的位置 (例如 last()-1)。

謂詞(方括號內的表達式)之前必須帶有標簽名稱(chēng),星號或其他謂詞。position 謂詞前必須有標簽名稱(chēng)。

參考?

函數?

xml.etree.ElementTree.canonicalize(xml_data=None, *, out=None, from_file=None, **options)?

C14N 2.0 轉換功能。.

規整化是標準化 XML 輸出的一種方式,該方式允許按字節比較和數字簽名。 它降低了 XML 序列化器所具有的自由度并改為生成更受約束的 XML 表示形式。 主要限制涉及命名空間聲明的位置、屬性的順序和可忽略的空白符等。

此函數接受一個(gè) XML 數字字符串 (xml_data) 或文件路徑或者文件類(lèi)對象 (from_file) 作為輸入,將其轉換為規整形式,并在提供了 out 文件(類(lèi))對象的情況下將其寫(xiě)到該對象的話(huà),或者如果未提供則將其作為文本字符串返回。 輸出文件接受文本而非字節數據。 因此它應當以使用 utf-8 編碼格式的文本模式來(lái)打開(kāi)。

典型使用:

xml_data = "<root>...</root>"
print(canonicalize(xml_data))

with open("c14n_output.xml", mode='w', encoding='utf-8') as out_file:
    canonicalize(xml_data, out=out_file)

with open("c14n_output.xml", mode='w', encoding='utf-8') as out_file:
    canonicalize(from_file="inputfile.xml", out=out_file)

配置選項 options 如下:

  • with_comments: 設為真值以包括注釋 (默認為假值)

  • strip_text: 設為真值以去除文本內容前后的空白符

    (默認值:否)

  • rewrite_prefixes: 設為真值以替換帶有 "n{number}" 前綴的命名空間

    (默認值:否)

  • qname_aware_tags: 一組可感知限定名稱(chēng)的標記名稱(chēng),其中的前綴

    應當在文本內容中被替換 (默認為空值)

  • qname_aware_attrs: 一組可感知限定名稱(chēng)的屬性名稱(chēng),其中的前綴

    應當在文本內容中被替換 (默認為空值)

  • exclude_attrs: 一組不應當被序列化的屬性名稱(chēng)

  • exclude_tags: 一組不應當被序列化的標記名稱(chēng)

在上面的選項列表中,"一組" 是指任意多項集或包含字符串的可迭代對象,排序是不必要的。

3.8 新版功能.

xml.etree.ElementTree.Comment(text=None)?

注釋元素工廠(chǎng)函數。 這個(gè)工廠(chǎng)函數可創(chuàng )建一個(gè)特殊元素,它將被標準序列化器當作 XML 注釋來(lái)進(jìn)行序列化。 注釋字串可以是字節串或是 Unicode 字符串。 text 是包含注釋字串的字符串。 返回一個(gè)表示注釋的元素實(shí)例。

請注意 XMLParser 會(huì )跳過(guò)輸入中的注釋而不會(huì )為其創(chuàng )建注釋對象。 ElementTree 將只在當使用某個(gè) Element 方法向樹(shù)插入了注釋節點(diǎn)時(shí)才會(huì )包含注釋節點(diǎn)。

xml.etree.ElementTree.dump(elem)?

將一個(gè)元素樹(shù)或元素結構體寫(xiě)入到 sys.stdout。 此函數應當只被用于調試。

實(shí)際輸出格式是依賴(lài)于具體實(shí)現的。 在這個(gè)版本中,它將以普通 XML 文件的格式寫(xiě)入。

elem 是一個(gè)元素樹(shù)或單獨元素。

在 3.8 版更改: dump() 函數現在會(huì )保留用戶(hù)指定的屬性順序。

xml.etree.ElementTree.fromstring(text, parser=None)?

根據一個(gè)字符串常量解析 XML 的節。 與 XML() 類(lèi)似。 text 是包含 XML 數據的字符串。 parser 是可選的解析器實(shí)例。 如果未給出,則會(huì )使用標準 XMLParser 解析器。 返回一個(gè) Element 實(shí)例。

xml.etree.ElementTree.fromstringlist(sequence, parser=None)?

根據一個(gè)字符串片段序列解析 XML 文檔。 sequence 是包含 XML 數據片段的列表或其他序列對象。 parser 是可選的解析器實(shí)例。 如果未給出,則會(huì )使用標準的 XMLParser 解析器。 返回一個(gè) Element 實(shí)例。

3.2 新版功能.

xml.etree.ElementTree.indent(tree, space='  ', level=0)?

添加空格到子樹(shù)來(lái)實(shí)現樹(shù)的縮進(jìn)效果。 這可以被用來(lái)生成美化打印的 XML 輸出。 tree 可以為 Element 或 ElementTree。 space 是對應將被插入的每個(gè)縮進(jìn)層級的空格字符串,默認為兩個(gè)空格符。 要對已縮進(jìn)的樹(shù)的部分子樹(shù)進(jìn)行縮進(jìn),請傳入初始縮進(jìn)層級作為 level。

3.9 新版功能.

xml.etree.ElementTree.iselement(element)?

檢測一個(gè)對象是否為有效的元素對象。 element 是一個(gè)元素實(shí)例。 如果對象是一個(gè)元素對象則返回 True。

xml.etree.ElementTree.iterparse(source, events=None, parser=None)?

以增量方式將一個(gè) XML 節解析為元素樹(shù),并向用戶(hù)報告執行情況。 source 是包含 XML 數據的文件名或 file object。 events 是要報告的事件序列。 所支持的事件字符串有 "start", "end", "comment", "pi", "start-ns""end-ns" ("ns" 事件用于獲取詳細的命名空間信息)。 如果 events 被省略,則只有 "end" 事件會(huì )被報告。 parser 是可選的解析器實(shí)例。 如果未給出,則會(huì )使用標準的 XMLParser 解析器。 parser 必須為 XMLParser 的子類(lèi)并且只能使用默認的 TreeBuilder 作為目標。 返回一個(gè)提供 (event, elem) 對的 iterator。

請注意雖然 iterparse() 是以增量方式構建樹(shù),但它會(huì )對 source (或其所指定的文件) 發(fā)出阻塞式讀取。 因此,它不適用于不可執行阻塞式讀取的應用。 對于完全非阻塞式的解析,請參看 XMLPullParser。

備注

iterparse() 只會(huì )確保當發(fā)出 "start" 事件時(shí)看到了開(kāi)始標記的 ">" 字符,因而在這個(gè)點(diǎn)上屬性已被定義,但文本容和末尾屬性還未被定義。 這同樣適用于元素的下級;它們可能存在也可能不存在。

如果你需要已完全填充的元素,請改為查找 "end" 事件。

3.4 版后已移除: parser 參數。

在 3.8 版更改: 增加了 commentpi 事件。

xml.etree.ElementTree.parse(source, parser=None)?

將一個(gè) XML 的節解析為元素樹(shù)。 source 是包含 XML 數據的文件名或文件對象。 parser 是可選的解析器實(shí)例。 如果未給出,則會(huì )使用標準的 XMLParser 解析器。 返回一個(gè) ElementTree 實(shí)例。

xml.etree.ElementTree.ProcessingInstruction(target, text=None)?

PI 元素工廠(chǎng)函數。 這個(gè)工廠(chǎng)函數可創(chuàng )建一個(gè)特殊元素,它將被當作 XML 處理指令來(lái)進(jìn)行序列化。 target 是包含 PI 目標的字符串。 text 如果給出則是包含 PI 內容的字符串。 返回一個(gè)表示處理指令的元素實(shí)例。

請注意 XMLParser 會(huì )跳過(guò)輸入中的處理指令而不會(huì )為其創(chuàng )建注釋對象。 ElementTree 將只在當使用某個(gè) Element 方法向樹(shù)插入了處理指令節點(diǎn)時(shí)才會(huì )包含處理指令節點(diǎn)。

xml.etree.ElementTree.register_namespace(prefix, uri)?

注冊一個(gè)命名空間前綴。 這個(gè)注冊表是全局的,并且任何對應給定前綴或命名空間 URI 的現有映射都會(huì )被移除。 prefix 是命名空間前綴。 uri 是命名空間 URI。 如果可能的話(huà),這個(gè)命名空間中的標記和屬性將附帶給定的前綴來(lái)進(jìn)行序列化。

3.2 新版功能.

xml.etree.ElementTree.SubElement(parent, tag, attrib={}, **extra)?

子元素工廠(chǎng)函數。 這個(gè)函數會(huì )創(chuàng )建一個(gè)元素實(shí)例,并將其添加到現有的元素。

元素名、屬性名和屬性值可以是字節串或 Unicode 字符串。 parent 是父元素。 tag 是子元素名。 attrib 是一個(gè)可選的字典,其中包含元素屬性。 extra 包含額外的屬性,以關(guān)鍵字參數形式給出。 返回一個(gè)元素實(shí)例。

xml.etree.ElementTree.tostring(element, encoding='us-ascii', method='xml', *, xml_declaration=None, default_namespace=None, short_empty_elements=True)?

生成一個(gè) XML 元素的字符串表示形式,包括所有子元素。 element 是一個(gè) Element 實(shí)例。 encoding 1 是輸出編碼格式(默認為 US-ASCII)。 請使用 encoding="unicode" 來(lái)生成 Unicode 字符串(否則生成字節串)。 method"xml", "html""text" (默認為 "xml")。 xml_declaration, default_namespaceshort_empty_elements 具有與 ElementTree.write() 中一致的含義。 返回一個(gè)包含 XML 數據(可選)已編碼的字符串。

3.4 新版功能: short_empty_elements 形參。

3.8 新版功能: xml_declarationdefault_namespace 形參。

在 3.8 版更改: tostring() 函數現在會(huì )保留用戶(hù)指定的屬性順序。

xml.etree.ElementTree.tostringlist(element, encoding='us-ascii', method='xml', *, xml_declaration=None, default_namespace=None, short_empty_elements=True)?

生成一個(gè) XML 元素的字符串表示形式,包括所有子元素。 element 是一個(gè) Element 實(shí)例。 encoding 1 是輸出編碼格式(默認為 US-ASCII)。 請使用 encoding="unicode" 來(lái)生成 Unicode 字符串(否則生成字節串)。 method"xml", "html""text" (默認為 "xml")。 xml_declaration, default_namespaceshort_empty_elements 具有與 ElementTree.write() 中一致的含義。 返回一個(gè)包含 XML 數據(可選)已編碼字符串的列表。 它并不保證任何特定的序列,除了 b"".join(tostringlist(element)) == tostring(element)。

3.2 新版功能.

3.4 新版功能: short_empty_elements 形參。

3.8 新版功能: xml_declarationdefault_namespace 形參。

在 3.8 版更改: tostringlist() 函數現在會(huì )保留用戶(hù)指定的屬性順序。

xml.etree.ElementTree.XML(text, parser=None)?

根據一個(gè)字符串常量解析 XML 的節。 此函數可被用于在 Python 代碼中嵌入“XML 字面值”。 text 是包含 XML 數據的字符串。 parser 是可選的解析器實(shí)例。 如果未給出,則會(huì )使用標準的 XMLParser 解析器。 返回一個(gè) Element 實(shí)例。

xml.etree.ElementTree.XMLID(text, parser=None)?

根據一個(gè)字符串常量解析 XML 的節,并且還將返回一個(gè)將元素的 id:s 映射到元素的字典。 text 是包含 XML 數據的字符串。 parser 是可選的解析器實(shí)例。 如果未給出,則會(huì )使用標準的 XMLParser 解析器。 返回一個(gè)包含 Element 實(shí)例和字典的元組。

XInclude 支持?

此模塊通過(guò) xml.etree.ElementInclude 輔助模塊提供了對 XInclude 指令 的有限支持,這個(gè)模塊可被用來(lái)根據元素樹(shù)的信息在其中插入子樹(shù)和文本字符串。

示例?

以下是一個(gè)演示 XInclude 模塊用法的例子。 要在當前文本中包括一個(gè) XML 文檔,請使用 {http://www.w3.org/2001/XInclude}include 元素并將 parse 屬性設為 "xml",并使用 href 屬性來(lái)指定要包括的文檔。

<?xml version="1.0"?>
<document xmlns:xi="http://www.w3.org/2001/XInclude">
  <xi:include href="source.xml" parse="xml" />
</document>

默認情況下,href 屬性會(huì )被當作文件名來(lái)處理。 你可以使用自定義加載器來(lái)重載此行為。 還要注意標準輔助器不支持 XPointer 語(yǔ)法。

要處理這個(gè)文件,請正常加載它,并將根元素傳給 xml.etree.ElementTree 模塊:

from xml.etree import ElementTree, ElementInclude

tree = ElementTree.parse("document.xml")
root = tree.getroot()

ElementInclude.include(root)

ElementInclude 模塊使用來(lái)自 source.xml 文檔的根元素替代 {http://www.w3.org/2001/XInclude}include 元素。 結果看起來(lái)大概是這樣:

<document xmlns:xi="http://www.w3.org/2001/XInclude">
  <para>This is a paragraph.</para>
</document>

如果省略了 parse 屬性,它會(huì )取默認的 "xml"。 要求有 href 屬性。

要包括文本文檔,請使用 {http://www.w3.org/2001/XInclude}include 元素,并將 parse 屬性設為 "text":

<?xml version="1.0"?>
<document xmlns:xi="http://www.w3.org/2001/XInclude">
  Copyright (c) <xi:include href="year.txt" parse="text" />.
</document>

結果可能如下所示:

<document xmlns:xi="http://www.w3.org/2001/XInclude">
  Copyright (c) 2003.
</document>

參考?

函數?

xml.etree.ElementInclude.default_loader(href, parse, encoding=None)?

默認的加載器。 這個(gè)默認的加載器會(huì )從磁盤(pán)讀取所包括的資源。 href 是一個(gè) URL。 parse 是 "xml" 或 "text" 表示解析模式。 encoding 是可選的文本編碼格式。 如果未給出,則編碼格式為 utf-8。 返回已擴展的資源。 如果解析模式為 "xml",則它是一個(gè) ElementTree 實(shí)例。 如果解析模式為 "text",則它是一個(gè) Unicode 字符串。 如果加載器失敗,它可以返回 None 或者引發(fā)異常。

xml.etree.ElementInclude.include(elem, loader=None, base_url=None, max_depth=6)?

這個(gè)函數會(huì )擴展 XInclude 指令。 elem 是根元素。 loader 是可選的資源加載器。 如果省略,則它默認為 default_loader()。 如果給出,則它應當是一個(gè)實(shí)現了與 default_loader() 相同的接口的可調用對象。 base_url 是原文件的基準 URL,用于求解相對的包括文件引用。 max_depth 是遞歸包括的最大數量。 此限制是為了降低惡意內容爆破的風(fēng)險。 傳入一個(gè)負值可禁用此限制。

返回已擴展的資源。 如果解析模式為 "xml",則它是一個(gè) ElementTree 實(shí)例。 如果解析模式為 "text",則它是一個(gè) Unicode 字符串。 如果加載器失敗,它可以返回 None 或者引發(fā)異常。

3.9 新版功能: base_urlmax_depth 形參。

元素對象?

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

元素類(lèi)。 這個(gè)類(lèi)定義了 Element 接口,并提供了這個(gè)接口的引用實(shí)現。

元素名、屬性名和屬性值可以是字節串或 Unicode 字符串。 tag 是元素名。 attrib 是一個(gè)可選的字典,其中包含元素屬性。 extra 包含額外的屬性,以關(guān)鍵字參數形式給出。

tag?

一個(gè)標識此元素意味著(zhù)何種數據的字符串(換句話(huà)說(shuō),元素類(lèi)型)。

text?
tail?

這些屬性可被用于存放與元素相關(guān)聯(lián)的額外數據。 它們的值通常為字符串但也可以是任何應用專(zhuān)屬的對象。 如果元素是基于 XML 文件創(chuàng )建的,text 屬性會(huì )存放元素的開(kāi)始標記及其第一個(gè)子元素或結束標記之間的文本,或者為 None,而 tail 屬性會(huì )存放元素的結束標記及下一個(gè)標記之間的文本,或者為 None。 對于 XML 數據

<a><b>1<c>2<d/>3</c></b>4</a>

a 元素的 texttail 屬性均為 None,b 元素的 text"1"tail"4",c 元素的 text"2"tailNone,d 元素的 textNonetail"3"。

要獲取一個(gè)元素的內部文本,請參閱 itertext(),例如 "".join(element.itertext())。

應用程序可以將任意對象存入這些屬性。

attrib?

一個(gè)包含元素屬性的字典。 請注意雖然 attrib 值總是一個(gè)真正可變的 Python 字典,但 ElementTree 實(shí)現可以選擇其他內部表示形式,并只在有需要時(shí)才創(chuàng )建字典。 為了發(fā)揮這種實(shí)現的優(yōu)勢,請在任何可能情況下使用下列字典方法。

以下字典類(lèi)方法作用于元素屬性。

clear()?

重設一個(gè)元素。 此方法會(huì )移除所有子元素,清空所有屬性,并將 text 和 tail 屬性設為 None。

get(key, default=None)?

獲取名為 key 的元素屬性。

返回屬性的值,或者如果屬性未找到則返回 default。

items()?

將元素屬性以 (name, value) 對序列的形式返回。 所返回屬性的順序任意。

keys()?

將元素屬性名稱(chēng)以列表的形式返回。 所返回名稱(chēng)的順序任意。

set(key, value)?

將元素的 key 屬性設為 value。

以下方法作用于元素的下級(子元素)。

append(subelement)?

將元素 subelement 添加到此元素的子元素內部列表。 如果 subelement 不是一個(gè) Element 則會(huì )引發(fā) TypeError。

extend(subelements)?

使用具有零個(gè)或多個(gè)元素的序列對象添加 subelements。 如果某個(gè)子元素不是 Element 則會(huì )引發(fā) TypeError。

3.2 新版功能.

find(match, namespaces=None)?

查找第一個(gè)匹配 match 的子元素。 match 可以是一個(gè)標記名稱(chēng)或者 路徑。 返回一個(gè)元素實(shí)例或 None。 namespaces 是可選的從命名空間前綴到完整名稱(chēng)的映射。 傳入 '' 作為前綴可將表達式中所有無(wú)前綴的標記名稱(chēng)移動(dòng)到給定的命名空間。

findall(match, namespaces=None)?

根據標記名稱(chēng)或者 路徑 查找所有匹配的子元素。 返回一個(gè)包含所有匹配元素按文檔順序排序的列表。 namespaces 是可選的從命名空間前綴到完整名稱(chēng)的映射。 傳入 '' 作為前綴可將表達式中所有無(wú)前綴的標記名稱(chēng)移動(dòng)到給定的命名空間。

findtext(match, default=None, namespaces=None)?

查找第一個(gè)匹配 match 的子元素的文本。 match 可以是一個(gè)標記名稱(chēng)或者 路徑。 反回第一個(gè)匹配的元素的文本內容,或者如果元素未找到則返回 default。 請注意如果匹配的元素沒(méi)有文本內容則會(huì )返回一個(gè)空字符串。 namespaces 是可選的從命名空間前綴到完整名稱(chēng)的映射。 傳入 '' 作為前綴可將表達式中所有無(wú)前綴的標記名稱(chēng)移動(dòng)到給定的命名空間。

insert(index, subelement)?

subelement 插入到此元素的給定位置中。 如果 subelement 不是一個(gè) Element 則會(huì )引發(fā) TypeError。

iter(tag=None)?

創(chuàng )建一個(gè)以當前元素為根元素的樹(shù)的 iterator。 該迭代器將以文檔(深度優(yōu)先)順序迭代此元素及其所有下級元素。 如果 tag 不為 None'*',則迭代器只返回標記為 tag 的元素。 如果樹(shù)結構在迭代期間被修改,則結果是未定義的。

3.2 新版功能.

iterfind(match, namespaces=None)?

根據標記名稱(chēng)或者 路徑 查找所有匹配的子元素。 返回一個(gè)按文檔順序產(chǎn)生所有匹配元素的可迭代對象。 namespaces 是可選的從命名空間前綴到完整名稱(chēng)的映射。

3.2 新版功能.

itertext()?

創(chuàng )建一個(gè)文本迭代器。 該迭代器將按文檔順序遍歷此元素及其所有子元素,并返回所有內部文本。

3.2 新版功能.

makeelement(tag, attrib)?

創(chuàng )建一個(gè)與此元素類(lèi)型相同的新元素對象。 請不要調用此方法,而應改用 SubElement() 工廠(chǎng)函數。

remove(subelement)?

從元素中移除 subelement。 與 find* 方法不同的是此方法會(huì )基于實(shí)例的標識來(lái)比較元素,而不是基于標記的值或內容。

Element 對象還支持下列序列類(lèi)型方法以配合子元素使用: __delitem__(), __getitem__(), __setitem__(), __len__()。

注意:不帶子元素的元素將被檢測為 False。 此行為將在未來(lái)的版本中發(fā)生變化。 請改用 len(elem)elem is None 進(jìn)行檢測。

element = root.find('foo')

if not element:  # careful!
    print("element not found, or element has no subelements")

if element is None:
    print("element not found")

在 Python 3.8 之前,元素的 XML 屬性的序列化順序會(huì )通過(guò)按其名稱(chēng)排序來(lái)強制使其可被預期。 由于現在字典已保證是有序的,這個(gè)強制重排序在 Python 3.8 中已被移除以保留原本由用戶(hù)代碼解析或創(chuàng )建的屬性順序。

通常,用戶(hù)代碼應當盡量不依賴(lài)于特定的屬性順序,因為 XML 信息設定 明確地排除了用屬性順序轉遞信息的做法。 代碼應當準備好處理任何輸入順序。 對于要求確定性的 XML 輸出的情況,例如加密簽名或檢測數據集等,可以通過(guò)規范化 canonicalize() 函數來(lái)進(jìn)行傳統的序列化。

對于規范化輸出不可用但仍然要求輸出特定屬性順序的情況,代碼應當設法直接按要求的順序來(lái)創(chuàng )建屬性,以避免代碼閱讀者產(chǎn)生不匹配的感覺(jué)。 如果這一點(diǎn)是難以做到的,可以在序列化之前應用以下寫(xiě)法來(lái)強制實(shí)現順序不依賴(lài)于元素的創(chuàng )建:

def reorder_attributes(root):
    for el in root.iter():
        attrib = el.attrib
        if len(attrib) > 1:
            # adjust attribute order, e.g. by sorting
            attribs = sorted(attrib.items())
            attrib.clear()
            attrib.update(attribs)

ElementTree 對象?

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

ElementTree 包裝器類(lèi)。 這個(gè)類(lèi)表示一個(gè)完整的元素層級結構,并添加了一些對于標準 XML 序列化的額外支持。

element 是根元素。 如果給出 XML file 則將使用其內容來(lái)初始化樹(shù)結構。

_setroot(element)?

替換該樹(shù)結構的根元素。 這將丟棄該樹(shù)結構的當前內容,并將其替換為給定的元素。 請小心使用。 element 是一個(gè)元素實(shí)例。

find(match, namespaces=None)?

Element.find() 類(lèi)似,從樹(shù)的根節點(diǎn)開(kāi)始。

findall(match, namespaces=None)?

Element.findall() 類(lèi)似,從樹(shù)的根節點(diǎn)開(kāi)始。

findtext(match, default=None, namespaces=None)?

Element.findtext() 類(lèi)似,從樹(shù)的根節點(diǎn)開(kāi)始。

getroot()?

返回這個(gè)樹(shù)的根元素。

iter(tag=None)?

創(chuàng )建并返回根元素的樹(shù)結構迭代器。 該迭代器會(huì )以節順序遍歷這個(gè)樹(shù)的所有元素。 tag 是要查找的標記(默認返回所有元素)。

iterfind(match, namespaces=None)?

Element.iterfind() 類(lèi)似,從樹(shù)的根節點(diǎn)開(kāi)始。

3.2 新版功能.

parse(source, parser=None)?

將一個(gè)外部 XML 節載入到此元素樹(shù)。 source 是一個(gè)文件名或 file object。 parser 是可選的解析器實(shí)例。 如果未給出,則會(huì )使用標準的 XMLParser 解析器。 返回該節的根元素。

write(file, encoding='us-ascii', xml_declaration=None, default_namespace=None, method='xml', *, short_empty_elements=True)?

將元素樹(shù)以 XML 格式寫(xiě)入到文件。 file 為文件名,或是以寫(xiě)入模式打開(kāi)的 file object。 encoding 1 為輸出編碼格式 (默認為 US-ASCII)。 xml_declaration 控制是否要將 XML 聲明添加到文件中。 使用 False 表示從不添加,True 表示總是添加,None 表示僅在非 US-ASCII 或 UTF-8 或 Unicode 時(shí)添加 (默認為 None)。 default_namespace 設置默認 XML 命名空間 (用于 "xmlns")。 method"xml", "html""text" (默認為 "xml")。 僅限關(guān)鍵字形參 short_empty_elements 控制不包含內容的元素的格式。 如為 True (默認值),它們會(huì )被輸出為單個(gè)自結束標記,否則它們會(huì )被輸出為一對開(kāi)始/結束標記。

輸出是一個(gè)字符串 (str) 或字節串 (bytes)。 由*encoding* 參數來(lái)控制。 如果 encoding"unicode",則輸出是一個(gè)字符串;否則為字節串;請注意這可能與 file 的類(lèi)型相沖突,如果它是一個(gè)打開(kāi)的 file object 的話(huà);請確保你不會(huì )試圖寫(xiě)入字符串到二進(jìn)制流或者反向操作。

3.4 新版功能: short_empty_elements 形參。

在 3.8 版更改: write() 方法現在會(huì )保留用戶(hù)指定的屬性順序。

這是將要被操作的 XML 文件:

<html>
    <head>
        <title>Example page</title>
    </head>
    <body>
        <p>Moved to <a href="http://example.org/">example.org</a>
        or <a href="http://example.com/">example.com</a>.</p>
    </body>
</html>

修改第一段中的每個(gè)鏈接的 "target" 屬性的示例:

>>>
>>> from xml.etree.ElementTree import ElementTree
>>> tree = ElementTree()
>>> tree.parse("index.xhtml")
<Element 'html' at 0xb77e6fac>
>>> p = tree.find("body/p")     # Finds first occurrence of tag p in body
>>> p
<Element 'p' at 0xb77ec26c>
>>> links = list(p.iter("a"))   # Returns list of all links
>>> links
[<Element 'a' at 0xb77ec2ac>, <Element 'a' at 0xb77ec1cc>]
>>> for i in links:             # Iterates through all found links
...     i.attrib["target"] = "blank"
>>> tree.write("output.xhtml")

QName 對象?

class xml.etree.ElementTree.QName(text_or_uri, tag=None)?

QName 包裝器。 這可被用來(lái)包裝 QName 屬性值,以便在輸出中獲得適當的命名空間處理。 text_or_uri 是一個(gè)包含 QName 值的字符串,其形式為 {uri}local,或者如果給出了 tag 參數,則為 QName 的 URI 部分。 如果給出了 tag,則第一個(gè)參數會(huì )被解讀為 URI,而這個(gè)參數會(huì )被解讀為本地名稱(chēng)。 QName 實(shí)例是不透明的。

TreeBuilder 對象?

class xml.etree.ElementTree.TreeBuilder(element_factory=None, *, comment_factory=None, pi_factory=None, insert_comments=False, insert_pis=False)?

通用元素結構構建器。 此構建器會(huì )將包含 start, data, end, comment 和 pi 方法調用的序列轉換為格式良好的元素結構。 你可以通過(guò)這個(gè)類(lèi)使用一個(gè)自定義 XML 解析器或其他 XML 類(lèi)格式的解析器來(lái)構建元素結構。

如果給出 element_factory,它必須為接受兩個(gè)位置參數的可調用對象:一個(gè)標記和一個(gè)屬性字典。 它預期會(huì )返回一個(gè)新的元素實(shí)例。

如果給出 comment_factorypi_factory 函數,它們的行為應當像 Comment()ProcessingInstruction() 函數一樣創(chuàng )建注釋和處理指令。 如果未給出,則將使用默認工廠(chǎng)函數。 當 insert_comments 和/或 insert_pis 為真值時(shí),如果 comments/pis 在根元素之中(但不在其之外)出現則它們將被插入到樹(shù)中。

close()?

刷新構建器緩存,并返回最高層級的文檔元素。 返回一個(gè) Element 實(shí)例。

data(data)?

將文本添加到當前元素。 data 為要添加的文本。 這應當是一個(gè)字節串或 Unicode 字符串。

end(tag)?

關(guān)閉當前元素。 tag 是元素名稱(chēng)。 返回已關(guān)閉的元素。

start(tag, attrs)?

打開(kāi)一個(gè)新元素。 tag 是元素名稱(chēng)。 attrs 是包含元素屬性的字典。 返回打開(kāi)的元素。

comment(text)?

使用給定的 text 創(chuàng )建一條注釋。 如果 insert_comments 為真值,這還會(huì )將其添加到樹(shù)結構中。

3.8 新版功能.

pi(target, text)?

使用給定的 target 名稱(chēng)和 text 創(chuàng )建一條注釋。 如果 insert_pis 為真值,這還會(huì )將其添加到樹(shù)結構中。

3.8 新版功能.

此外,自定義的 TreeBuilder 對象還提供了以下方法:

doctype(name, pubid, system)?

處理一條 doctype 聲明。 name 為 doctype 名稱(chēng)。 pubid 為公有標識。 system 為系統標識。 此方法不存在于默認的 TreeBuilder 類(lèi)中。

3.2 新版功能.

start_ns(prefix, uri)?

在定義了 start() 回調的打開(kāi)元素的該回調被調用之前,當解析器遇到新的命名空間聲明時(shí)都會(huì )被調用。 prefix 對于默認命名空間為 '' 或者在其他情況下為被聲明的命名空間前綴名稱(chēng)。 uri 是命名空間 URI。

3.8 新版功能.

end_ns(prefix)?

在聲明了命名空間前綴映射的元素的 end() 回調之后被調用,附帶超出作用域的 prefix 的名稱(chēng)。

3.8 新版功能.

class xml.etree.ElementTree.C14NWriterTarget(write, *, with_comments=False, strip_text=False, rewrite_prefixes=False, qname_aware_tags=None, qname_aware_attrs=None, exclude_attrs=None, exclude_tags=None)?

C14N 2.0 寫(xiě)入器。 其參數與 canonicalize() 函數的相同。 這個(gè)類(lèi)并不會(huì )構建樹(shù)結構而是使用 write 函數將回調事件直接轉換為序列化形式。

3.8 新版功能.

XMLParser對象?

class xml.etree.ElementTree.XMLParser(*, target=None, encoding=None)?

這個(gè)類(lèi)是此模塊的低層級構建單元。 它使用 xml.parsers.expat 來(lái)實(shí)現高效、基于事件的 XML 解析。 它可以通過(guò) feed() 方法增量式地收受 XML 數據,并且解析事件會(huì )被轉換為推送式 API —— 通過(guò)在 target 對象上發(fā)起對回調的調用。 如果省略 target,則會(huì )使用標準的 TreeBuilder。 如果給出了 encoding 1 ,該值將覆蓋在 XML 文件中指定的編碼格式。

在 3.8 版更改: 所有形參現在都是 僅限關(guān)鍵字形參。 html 參數不再受支持。

close()?

結束向解析器提供數據。 返回調用在構造期間傳入的 targetclose() 方法的結果;在默認情況下,這是最高層級的文檔元素。

feed(data)?

將數據送入解析器。 data 是編碼后的數據。

XMLParser.feed() 會(huì )為每個(gè)打開(kāi)的標記調用 targetstart(tag, attrs_dict) 方法,為每個(gè)關(guān)閉的標記調用它的 end(tag) 方法,并通過(guò) data(data) 方法來(lái)處理數據。 有關(guān)更多受支持的回調方法,請參閱 TreeBuilder 類(lèi)。 XMLParser.close() 會(huì )調用 targetclose() 方法。 XMLParser 不僅僅可被用來(lái)構建樹(shù)結構。 下面是一個(gè)統計 XML 文件最大深度的示例:

>>>
>>> from xml.etree.ElementTree import XMLParser
>>> class MaxDepth:                     # The target object of the parser
...     maxDepth = 0
...     depth = 0
...     def start(self, tag, attrib):   # Called for each opening tag.
...         self.depth += 1
...         if self.depth > self.maxDepth:
...             self.maxDepth = self.depth
...     def end(self, tag):             # Called for each closing tag.
...         self.depth -= 1
...     def data(self, data):
...         pass            # We do not need to do anything with data.
...     def close(self):    # Called when all data has been parsed.
...         return self.maxDepth
...
>>> target = MaxDepth()
>>> parser = XMLParser(target=target)
>>> exampleXml = """
... <a>
...   <b>
...   </b>
...   <b>
...     <c>
...       <d>
...       </d>
...     </c>
...   </b>
... </a>"""
>>> parser.feed(exampleXml)
>>> parser.close()
4

XMLPullParser對象?

class xml.etree.ElementTree.XMLPullParser(events=None)?

適用于非阻塞應用程序的拉取式解析器。 它的輸入側 API 與 XMLParser 的類(lèi)似,但不是向回調目標推送調用,XMLPullParser 會(huì )收集一個(gè)解析事件的內部列表并讓用戶(hù)來(lái)讀取它。 events 是要報告的事件序列。 受支持的事件字符串有 "start", "end", "comment", "pi", "start-ns""end-ns" ("ns" 事件被用于獲取詳細的命名空間信息)。 如果 events 被省略,則只報告 "end" 事件。

feed(data)?

將給定的字節數據送入解析器。

close()?

通知解析器數據流已終結。 不同于 XMLParser.close(),此方法總是返回 None。 當解析器被關(guān)閉時(shí)任何還未被獲取的事件仍可通過(guò) read_events() 被讀取。

read_events()?

返回包含在送入解析器的數據中遇到的事件的迭代器。 此迭代器會(huì )產(chǎn)生 (event, elem) 對,其中 event 是代表事件類(lèi)型的字符串 (例如 "end") 而 elem 是遇到的 Element 對象,或者以下的其他上下文值。

  • start, end: 當前元素。

  • comment, pi: 當前注釋 / 處理指令

  • start-ns: 一個(gè)指定所聲明命名空間映射的元組 (prefix, uri)。

  • end-ns: None (這可能在未來(lái)版本中改變)

在之前對 read_events() 的調用中提供的事件將不會(huì )被再次產(chǎn)生。 事件僅當它們從迭代器中被取出時(shí)才會(huì )在內部隊列中被消費,因此多個(gè)讀取方對獲取自 read_events() 的迭代器進(jìn)行平行迭代將產(chǎn)生無(wú)法預料的結果。

備注

XMLPullParser 只會(huì )確保當發(fā)出 "start" 事件時(shí)看到了開(kāi)始標記的 ">" 字符,因而在這個(gè)點(diǎn)上屬性已被定義,但文本內容和末尾屬性還未被定義。 這同樣適用于元素的下級;它們可能存在也可能不存在。

如果你需要已完全填充的元素,請改為查找 "end" 事件。

3.4 新版功能.

在 3.8 版更改: 增加了 commentpi 事件。

異常?

class xml.etree.ElementTree.ParseError?

XML 解析器錯誤,由此模塊中的多個(gè)解析方法在解析失敗時(shí)引發(fā)。 此異常的實(shí)例的字符串表示將包含用戶(hù)友好的錯誤消息。 此外,它將具有下列可用屬性:

code?

來(lái)自外部解析器的數字錯誤代碼。 請參閱 xml.parsers.expat 的文檔查看錯誤代碼列表及它們的含義。

position?

一個(gè)包含 line, column 數值的元組,指明錯誤發(fā)生的位置。

備注

1(1,2,3,4)

包括在 XML 輸出中的編碼格式字符串應當符合適當的標準。 例如 "UTF-8" 是有效的,但 "UTF8" 是無(wú)效的。 請參閱 https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDeclhttps://www.iana.org/assignments/character-sets/character-sets.xhtml。