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

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


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

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

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

警告

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

教程?

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

XML 樹(shù)和元素?

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

解析 XML?

我們將使用以下 XML 文檔作為本節(jié)的示例數(shù)據(jù):

<?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)導(dǎo)入此數(shù)據(jù):

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ù)的根元素。 其他解析函數(shù)可能會(huì)創(chuàng)建一個(gè) ElementTree 。 確切信息請(qǐng)查閱文檔。

作為 Element , root 具有標(biāo)簽和屬性字典:

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

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

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

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

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

備注

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

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

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

針對(duì)此需求的最強(qiáng)大工具是 XMLPullParser。 它不要求通過(guò)阻塞式讀取來(lái)獲得 XML 數(shù)據(jù),而是通過(guò)執(zhí)行 XMLPullParser.feed() 調(diào)用來(lái)增量式地添加數(shù)據(jù)。 要獲得已解析的 XML 元素,應(yīng)調(diào)用 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)的用例是針對(duì)以非阻塞方式進(jìn)行的應(yīng)用程序,其中 XML 是從套接字接收或從某些存儲(chǔ)設(shè)備增量式讀取的。 在這些用例中,阻塞式讀取是不可接受的。

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

查找感興趣的元素?

Element 有一些很有效的方法,可幫助遞歸遍歷其下的所有子樹(shù)(包括子級(jí),子級(jí)的子級(jí),等等)。例如 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() 僅查找當(dāng)前元素的直接子元素中帶有指定標(biāo)簽的元素。 Element.find() 找?guī)в刑囟?biāo)簽的 第一個(gè) 子級(jí),然后可以用 Element.text 訪問(wèn)元素的文本內(nèi)容。 Element.get 訪問(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 提供了一種構(gòu)建XML文檔并將其寫(xiě)入文件的簡(jiǎn)單方法。調(diào)用 ElementTree.write() 方法就可以實(shí)現(xiàn)。

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

假設(shè)我們要為每個(gè)國(guó)家/地區(qū)的中添加一個(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現(xiàn)在看起來(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() 刪除元素。假設(shè)我們要?jiǎng)h除排名高于50的所有國(guó)家/地區(qū):

>>>
>>> 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')

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

生成的XML現(xiàn)在看起來(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>

構(gòu)建 XML 文檔?

SubElement() 函數(shù)還提供了一種便捷方法來(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 形式的標(biāo)記和屬性將被擴(kuò)展為 {uri}sometag,其中 prefix 會(huì)被完整 URI 所替換。 并且,如果存在 默認(rèn)命名空間,則完整 URI 會(huì)被添加到所有未加前綴的標(biāo)記之前。

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

<?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è)標(biāo)記或?qū)傩蕴砑?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)存放你自己的前綴并在搜索函數(shù)中使用它們:

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支持?

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

示例?

下面是一個(gè)演示此模塊的部分 XPath 功能的例子。 我們將使用來(lái)自 解析 XML 小節(jié)的 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]")

對(duì)于帶有命名空間的 XML,應(yīng)使用通常的限定 {namespace}tag 標(biāo)記法:

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

支持的XPath語(yǔ)法?

語(yǔ)法

含意

tag

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

在 3.8 版更改: 增加了對(duì)星號(hào)通配符的支持。

*

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

.

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

//

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

..

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

[@attrib]

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

[@attrib='value']

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

[@attrib!='value']

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

3.10 新版功能.

[tag]

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

[.='text']

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

3.7 新版功能.

[.!='text']

選擇完整文本內(nèi)容包括其下級(jí)內(nèi)容不等于給定的 text 的所有元素。

3.10 新版功能.

[tag='text']

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

[tag!='text']

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

3.10 新版功能.

[position]

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

謂詞(方括號(hào)內(nèi)的表達(dá)式)之前必須帶有標(biāo)簽名稱,星號(hào)或其他謂詞。position 謂詞前必須有標(biāo)簽名稱。

參考?

函數(shù)?

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

C14N 2.0 轉(zhuǎn)換功能。.

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

此函數(shù)接受一個(gè) XML 數(shù)字字符串 (xml_data) 或文件路徑或者文件類(lèi)對(duì)象 (from_file) 作為輸入,將其轉(zhuǎn)換為規(guī)整形式,并在提供了 out 文件(類(lèi))對(duì)象的情況下將其寫(xiě)到該對(duì)象的話,或者如果未提供則將其作為文本字符串返回。 輸出文件接受文本而非字節(jié)數(shù)據(jù)。 因此它應(yīng)當(dāng)以使用 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)

配置選項(xiàng) options 如下:

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

  • strip_text: 設(shè)為真值以去除文本內(nèi)容前后的空白符

    (默認(rèn)值:否)

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

    (默認(rèn)值:否)

  • qname_aware_tags: 一組可感知限定名稱的標(biāo)記名稱,其中的前綴

    應(yīng)當(dāng)在文本內(nèi)容中被替換 (默認(rèn)為空值)

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

    應(yīng)當(dāng)在文本內(nèi)容中被替換 (默認(rèn)為空值)

  • exclude_attrs: 一組不應(yīng)當(dāng)被序列化的屬性名稱

  • exclude_tags: 一組不應(yīng)當(dāng)被序列化的標(biāo)記名稱

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

3.8 新版功能.

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

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

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

xml.etree.ElementTree.dump(elem)?

將一個(gè)元素樹(shù)或元素結(jié)構(gòu)體寫(xiě)入到 sys.stdout。 此函數(shù)應(yīng)當(dāng)只被用于調(diào)試。

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

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

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

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

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

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

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

3.2 新版功能.

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

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

3.9 新版功能.

xml.etree.ElementTree.iselement(element)?

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

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

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

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

備注

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

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

3.4 版后已移除: parser 參數(shù)。

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

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

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

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

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

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

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

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

3.2 新版功能.

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

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

元素名、屬性名和屬性值可以是字節(jié)串或 Unicode 字符串。 parent 是父元素。 tag 是子元素名。 attrib 是一個(gè)可選的字典,其中包含元素屬性。 extra 包含額外的屬性,以關(guān)鍵字參數(shù)形式給出。 返回一個(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 是輸出編碼格式(默認(rèn)為 US-ASCII)。 請(qǐng)使用 encoding="unicode" 來(lái)生成 Unicode 字符串(否則生成字節(jié)串)。 method"xml", "html""text" (默認(rèn)為 "xml")。 xml_declaration, default_namespaceshort_empty_elements 具有與 ElementTree.write() 中一致的含義。 返回一個(gè)包含 XML 數(shù)據(jù)(可選)已編碼的字符串。

3.4 新版功能: short_empty_elements 形參。

3.8 新版功能: xml_declarationdefault_namespace 形參。

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

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 是輸出編碼格式(默認(rèn)為 US-ASCII)。 請(qǐng)使用 encoding="unicode" 來(lái)生成 Unicode 字符串(否則生成字節(jié)串)。 method"xml", "html""text" (默認(rèn)為 "xml")。 xml_declaration, default_namespaceshort_empty_elements 具有與 ElementTree.write() 中一致的含義。 返回一個(gè)包含 XML 數(shù)據(jù)(可選)已編碼字符串的列表。 它并不保證任何特定的序列,除了 b"".join(tostringlist(element)) == tostring(element)。

3.2 新版功能.

3.4 新版功能: short_empty_elements 形參。

3.8 新版功能: xml_declarationdefault_namespace 形參。

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

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

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

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

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

XInclude 支持?

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

示例?

以下是一個(gè)演示 XInclude 模塊用法的例子。 要在當(dāng)前文本中包括一個(gè) XML 文檔,請(qǐng)使用 {http://www.w3.org/2001/XInclude}include 元素并將 parse 屬性設(shè)為 "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>

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

要處理這個(gè)文件,請(qǐng)正常加載它,并將根元素傳給 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 元素。 結(jié)果看起來(lái)大概是這樣:

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

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

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

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

結(jié)果可能如下所示:

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

參考?

函數(shù)?

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

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

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

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

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

3.9 新版功能: base_urlmax_depth 形參。

元素對(duì)象?

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

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

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

tag?

一個(gè)標(biāo)識(shí)此元素意味著何種數(shù)據(jù)的字符串(換句話說(shuō),元素類(lèi)型)。

text?
tail?

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

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

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

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

應(yīng)用程序可以將任意對(duì)象存入這些屬性。

attrib?

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

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

clear()?

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

get(key, default=None)?

獲取名為 key 的元素屬性。

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

items()?

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

keys()?

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

set(key, value)?

將元素的 key 屬性設(shè)為 value。

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

append(subelement)?

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

extend(subelements)?

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

3.2 新版功能.

find(match, namespaces=None)?

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

findall(match, namespaces=None)?

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

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

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

insert(index, subelement)?

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

iter(tag=None)?

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

3.2 新版功能.

iterfind(match, namespaces=None)?

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

3.2 新版功能.

itertext()?

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

3.2 新版功能.

makeelement(tag, attrib)?

創(chuàng)建一個(gè)與此元素類(lèi)型相同的新元素對(duì)象。 請(qǐng)不要調(diào)用此方法,而應(yīng)改用 SubElement() 工廠函數(shù)。

remove(subelement)?

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

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

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

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ò)按其名稱排序來(lái)強(qiáng)制使其可被預(yù)期。 由于現(xiàn)在字典已保證是有序的,這個(gè)強(qiáng)制重排序在 Python 3.8 中已被移除以保留原本由用戶代碼解析或創(chuàng)建的屬性順序。

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

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

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

ElementTree 包裝器類(lèi)。 這個(gè)類(lèi)表示一個(gè)完整的元素層級(jí)結(jié)構(gòu),并添加了一些對(duì)于標(biāo)準(zhǔn) XML 序列化的額外支持。

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

_setroot(element)?

替換該樹(shù)結(jié)構(gòu)的根元素。 這將丟棄該樹(shù)結(jié)構(gòu)的當(dāng)前內(nèi)容,并將其替換為給定的元素。 請(qǐng)小心使用。 element 是一個(gè)元素實(shí)例。

find(match, namespaces=None)?

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

findall(match, namespaces=None)?

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

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

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

getroot()?

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

iter(tag=None)?

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

iterfind(match, namespaces=None)?

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

3.2 新版功能.

parse(source, parser=None)?

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

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

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

3.4 新版功能: short_empty_elements 形參。

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

這是將要被操作的 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 對(duì)象?

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

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

TreeBuilder 對(duì)象?

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

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

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

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

close()?

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

data(data)?

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

end(tag)?

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

start(tag, attrs)?

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

comment(text)?

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

3.8 新版功能.

pi(target, text)?

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

3.8 新版功能.

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

doctype(name, pubid, system)?

處理一條 doctype 聲明。 name 為 doctype 名稱。 pubid 為公有標(biāo)識(shí)。 system 為系統(tǒng)標(biāo)識(shí)。 此方法不存在于默認(rèn)的 TreeBuilder 類(lèi)中。

3.2 新版功能.

start_ns(prefix, uri)?

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

3.8 新版功能.

end_ns(prefix)?

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

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ě)入器。 其參數(shù)與 canonicalize() 函數(shù)的相同。 這個(gè)類(lèi)并不會(huì)構(gòu)建樹(shù)結(jié)構(gòu)而是使用 write 函數(shù)將回調(diào)事件直接轉(zhuǎn)換為序列化形式。

3.8 新版功能.

XMLParser對(duì)象?

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

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

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

close()?

結(jié)束向解析器提供數(shù)據(jù)。 返回調(diào)用在構(gòu)造期間傳入的 targetclose() 方法的結(jié)果;在默認(rèn)情況下,這是最高層級(jí)的文檔元素。

feed(data)?

將數(shù)據(jù)送入解析器。 data 是編碼后的數(shù)據(jù)。

XMLParser.feed() 會(huì)為每個(gè)打開(kāi)的標(biāo)記調(diào)用 targetstart(tag, attrs_dict) 方法,為每個(gè)關(guān)閉的標(biāo)記調(diào)用它的 end(tag) 方法,并通過(guò) data(data) 方法來(lái)處理數(shù)據(jù)。 有關(guān)更多受支持的回調(diào)方法,請(qǐng)參閱 TreeBuilder 類(lèi)。 XMLParser.close() 會(huì)調(diào)用 targetclose() 方法。 XMLParser 不僅僅可被用來(lái)構(gòu)建樹(shù)結(jié)構(gòu)。 下面是一個(gè)統(tǒng)計(jì) 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對(duì)象?

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

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

feed(data)?

將給定的字節(jié)數(shù)據(jù)送入解析器。

close()?

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

read_events()?

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

  • start, end: 當(dāng)前元素。

  • comment, pi: 當(dāng)前注釋 / 處理指令

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

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

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

備注

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

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

3.4 新版功能.

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

異常?

class xml.etree.ElementTree.ParseError?

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

code?

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

position?

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

備注

1(1,2,3,4)

包括在 XML 輸出中的編碼格式字符串應(yīng)當(dāng)符合適當(dāng)?shù)臉?biāo)準(zhǔn)。 例如 "UTF-8" 是有效的,但 "UTF8" 是無(wú)效的。 請(qǐng)參閱 https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDeclhttps://www.iana.org/assignments/character-sets/character-sets.xhtml。