19.7. xml.etree.ElementTree — ElementTree XML API —Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/2.7/library/xml.etree.elementtree
移動先:案内検索

19.7。 xml.etree.ElementTree — ElementTree XML API

バージョン2.5の新機能。


ソースコード: :source: `Lib / xml / etree / ElementTree.py`



Element タイプは、階層データ構造をメモリに格納するように設計された柔軟なコンテナオブジェクトです。 タイプは、リストと辞書の間のクロスとして説明できます。

警告

xml.etree.ElementTree モジュールは、悪意を持って構築されたデータに対して安全ではありません。 信頼できないデータまたは認証されていないデータを解析する必要がある場合は、 XMLの脆弱性を参照してください。


各要素には、それに関連付けられたいくつかのプロパティがあります。

  • この要素が表すデータの種類(つまり、要素タイプ)を識別する文字列であるタグ。
  • Pythonディクショナリに保存されているいくつかの属性。
  • テキスト文字列。
  • オプションのテールストリング。
  • Pythonシーケンスに格納された多数の子要素

要素インスタンスを作成するには、 Element コンストラクターまたは SubElement()ファクトリ関数を使用します。

ElementTree クラスを使用して、要素構造をラップし、XMLとの間で変換することができます。

このAPIのAC実装は、xml.etree.cElementTreeとして入手できます。

チュートリアルと他のドキュメントへのリンクについては、 http://effbot.org/zone/element-index.htmを参照してください。 Fredrik Lundhのページは、xml.etree.ElementTreeの開発バージョンの場所でもあります。

バージョン2.7で変更: ElementTreeAPIが1.3に更新されました。 詳細については、 ElementTree 1.3 の紹介を参照してください。


19.7.1。 チュートリアル

これは、 xml.etree.ElementTree (略してET)を使用するための短いチュートリアルです。 目標は、モジュールの構成要素と基本概念のいくつかを示すことです。

19.7.1.1。 XMLツリーと要素

XMLは本質的に階層的なデータ形式であり、XMLを表現する最も自然な方法はツリーを使用することです。 ETには、この目的のために2つのクラスがあります。 ElementTree はXMLドキュメント全体をツリーとして表し、 Element はこのツリーの単一ノードを表します。 ドキュメント全体とのやり取り(ファイルの読み取りと書き込み)は通常、 ElementTree レベルで行われます。 単一のXML要素とそのサブ要素との相互作用は、 Element レベルで行われます。


19.7.1.2。 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>

データをインポートする方法はいくつかあります。 ディスクからのファイルの読み取り:

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 に解析します。これは、解析されたツリーのルート要素です。 他の解析関数は、 ElementTree を作成する場合があります。 ドキュメントを確認してください。

Element として、rootにはタグと属性の辞書があります。

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

また、反復できる子ノードもあります。

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

子はネストされており、インデックスによって特定の子ノードにアクセスできます。

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

19.7.1.3。 興味深い要素を見つける

Element には、その下のすべてのサブツリー(その子、その子など)を再帰的に反復するのに役立ついくつかの便利なメソッドがあります。 例: 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()は、特定のタグを持つ first の子を検索し、 Element.text は要素のテキストコンテンツにアクセスします。 Element.get()は、要素の属性にアクセスします。

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

XPath を使用すると、検索する要素をより高度に指定できます。


19.7.1.4。 XMLファイルの変更

ElementTree は、XMLドキュメントを作成してファイルに書き込む簡単な方法を提供します。 ElementTree.write()メソッドはこの目的を果たします。

作成された Element オブジェクトは、そのフィールド( Element.text など)を直接変更したり、属性を追加および変更したり( Element.set())することで操作できます。メソッド)、および新しい子の追加(たとえば、 Element.append()を使用)。

各国のランクに1つ追加し、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は次のようになります。

<?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'):
...     rank = int(country.find('rank').text)
...     if rank > 50:
...         root.remove(country)
...
>>> tree.write('output.xml')

XMLは次のようになります。

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

19.7.1.5。 XMLドキュメントの作成

SubElement()関数は、特定の要素の新しいサブ要素を作成するための便利な方法も提供します。

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

19.7.1.6。 名前空間を使用したXMLの解析

XML入力に名前空間がある場合、prefix:sometagの形式のプレフィックスを持つタグと属性は{uri}sometagに展開され、プレフィックスは完全なものに置き換えられます URI 。 また、デフォルトの名前空間がある場合、その完全なURIがプレフィックスなしのすべてのタグの前に付加されます。

これは、2つの名前空間を組み込んだXMLの例です。1つは接頭辞「架空」で、もう1つはデフォルトの名前空間として機能します。

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

このXMLの例を検索して探索する1つの方法は、 find()または findall()のxpath内のすべてのタグまたは属性に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の例を検索するためのより良い方法は、独自のプレフィックスを使用して辞書を作成し、それらを検索関数で使用することです。

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

これらの2つのアプローチは両方とも出力します:

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

19.7.1.7。 追加のリソース

チュートリアルと他のドキュメントへのリンクについては、 http://effbot.org/zone/element-index.htmを参照してください。


19.7.2。 XPathサポート

このモジュールは、ツリー内の要素を見つけるための XPath式の限定的なサポートを提供します。 目標は、省略された構文の小さなサブセットをサポートすることです。 完全なXPathエンジンは、モジュールの範囲外です。

19.7.2.1。 例

これは、モジュールのXPath機能の一部を示す例です。 Parsing 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]")

19.7.2.2。 サポートされているXPath構文

構文 意味
tag 指定されたタグを持つすべての子要素を選択します。 たとえば、spamspamという名前のすべての子要素を選択し、spam/eggspamという名前のすべての子からeggという名前のすべての孫を選択します。
* すべての子要素を選択します。 たとえば、*/eggは、eggという名前のすべての孫を選択します。
. 現在のノードを選択します。 これは、パスの先頭で、相対パスであることを示すのに最も役立ちます。
// 現在の要素の下のすべてのレベルで、すべてのサブ要素を選択します。 たとえば、.//eggは、ツリー全体のすべてのegg要素を選択します。
.. 親要素を選択します。
[@attrib] 指定された属性を持つすべての要素を選択します。
[@attrib='value'] 指定された属性が指定された値を持つすべての要素を選択します。 値に引用符を含めることはできません。
[tag] tagという名前の子を持つすべての要素を選択します。 直接の子のみがサポートされます。
[tag='text'] tagという名前の子を持ち、子孫を含む完全なテキストコンテンツが指定されたtextと等しいすべての要素を選択します。
[position] 指定された位置にあるすべての要素を選択します。 位置は、整数(1は最初の位置)、式last()(最後の位置の場合)、または最後の位置に相対的な位置(例: last()-1)。

述語(角括弧内の式)の前には、タグ名、アスタリスク、または別の述語を付ける必要があります。 position述部の前には、タグ名を付ける必要があります。


19.7.3。 リファレンス

19.7.3.1。 関数

xml.etree.ElementTree.Comment(text=None)
コメント要素ファクトリ。 このファクトリ関数は、標準のシリアライザーによってXMLコメントとしてシリアル化される特別な要素を作成します。 コメント文字列は、バイト文字列またはUnicode文字列のいずれかです。 text は、コメント文字列を含む文字列です。 コメントを表す要素インスタンスを返します。
xml.etree.ElementTree.dump(elem)

要素ツリーまたは要素構造をsys.stdoutに書き込みます。 この関数は、デバッグにのみ使用する必要があります。

正確な出力形式は実装によって異なります。 このバージョンでは、通常のXMLファイルとして記述されています。

elem は、要素ツリーまたは個々の要素です。

xml.etree.ElementTree.fromstring(text)
文字列定数からXMLセクションを解析します。 XML()と同じです。 text は、XMLデータを含む文字列です。 Element インスタンスを返します。
xml.etree.ElementTree.fromstringlist(sequence, parser=None)

文字列フラグメントのシーケンスからXMLドキュメントを解析します。 sequence は、XMLデータフラグメントを含むリストまたはその他のシーケンスです。 parser は、オプションのパーサーインスタンスです。 指定しない場合は、標準の XMLParser パーサーが使用されます。 Element インスタンスを返します。

バージョン2.7の新機能。

xml.etree.ElementTree.iselement(element)
オブジェクトが有効な要素オブジェクトであるように見えるかどうかを確認します。 element は要素インスタンスです。 これが要素オブジェクトの場合、真の値を返します。
xml.etree.ElementTree.iterparse(source, events=None, parser=None)

XMLセクションを要素ツリーに段階的に解析し、何が起こっているかをユーザーに報告します。 source は、XMLデータを含むファイル名またはファイルオブジェクトです。 events は、報告するイベントのリストです。 省略した場合、「終了」イベントのみが報告されます。 parser は、オプションのパーサーインスタンスです。 指定しない場合は、標準の XMLParser パーサーが使用されます。 パーサーcElementTreeではサポートされていません。 (event, elem)ペアを提供するイテレータを返します。

ノート

iterparse()は、「開始」イベントを発行するときに開始タグの「>」文字が表示されることを保証するだけなので、属性は定義されていますが、テキスト属性とテール属性の内容は未定義です。その時点で。 同じことが要素の子にも当てはまります。 それらは存在する場合と存在しない場合があります。

完全に入力された要素が必要な場合は、代わりに「終了」イベントを探してください。

xml.etree.ElementTree.parse(source, parser=None)
XMLセクションを要素ツリーに解析します。 source は、XMLデータを含むファイル名またはファイルオブジェクトです。 parser は、オプションのパーサーインスタンスです。 指定しない場合は、標準の XMLParser パーサーが使用されます。 ElementTree インスタンスを返します。
xml.etree.ElementTree.ProcessingInstruction(target, text=None)
PIエレメントファクトリー。 このファクトリ関数は、XML処理命令としてシリアル化される特別な要素を作成します。 target は、PIターゲットを含む文字列です。 text は、指定されている場合、PIの内容を含む文字列です。 処理命令を表す要素インスタンスを返します。
xml.etree.ElementTree.register_namespace(prefix, uri)

名前空間プレフィックスを登録します。 レジストリはグローバルであり、指定されたプレフィックスまたは名前空間URIの既存のマッピングはすべて削除されます。 prefix は名前空間プレフィックスです。 uri は名前空間uriです。 この名前空間のタグと属性は、可能であれば、指定されたプレフィックスでシリアル化されます。

バージョン2.7の新機能。

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

サブエレメントファクトリ。 この関数は、要素インスタンスを作成し、それを既存の要素に追加します。

要素名、属性名、および属性値は、バイト文字列またはUnicode文字列のいずれかです。 parent は親要素です。 tag はサブエレメント名です。 attrib は、要素属性を含むオプションの辞書です。 extra には、キーワード引数として指定された追加の属性が含まれています。 要素インスタンスを返します。

xml.etree.ElementTree.tostring(element, encoding='us-ascii', method='xml')
すべてのサブ要素を含むXML要素の文字列表現を生成します。 elementElement インスタンスです。 encoding 1 は出力エンコーディングです(デフォルトはUS-ASCIIです)。 メソッドは、"xml""html"、または"text"のいずれかです(デフォルトは"xml")。 XMLデータを含むエンコードされた文字列を返します。
xml.etree.ElementTree.tostringlist(element, encoding='us-ascii', method='xml')

すべてのサブ要素を含むXML要素の文字列表現を生成します。 elementElement インスタンスです。 encoding 1 は出力エンコーディングです(デフォルトはUS-ASCIIです)。 メソッドは、"xml""html"、または"text"のいずれかです(デフォルトは"xml")。 XMLデータを含むエンコードされた文字列のリストを返します。 "".join(tostringlist(element)) == tostring(element)を除いて、特定のシーケンスを保証するものではありません。

バージョン2.7の新機能。

xml.etree.ElementTree.XML(text, parser=None)
文字列定数からXMLセクションを解析します。 この関数は、Pythonコードに「XMLリテラル」を埋め込むために使用できます。 text は、XMLデータを含む文字列です。 parser は、オプションのパーサーインスタンスです。 指定しない場合は、標準の XMLParser パーサーが使用されます。 Element インスタンスを返します。
xml.etree.ElementTree.XMLID(text, parser=None)
文字列定数からXMLセクションを解析し、要素id:sから要素にマップする辞書も返します。 text は、XMLデータを含む文字列です。 parser は、オプションのパーサーインスタンスです。 指定しない場合は、標準の XMLParser パーサーが使用されます。 Element インスタンスとディクショナリを含むタプルを返します。


19.7.3.2。 要素オブジェクト

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

要素クラス。 このクラスはElementインターフェースを定義し、このインターフェースのリファレンス実装を提供します。

要素名、属性名、および属性値は、バイト文字列またはUnicode文字列のいずれかです。 tag は要素名です。 attrib は、要素属性を含むオプションの辞書です。 extra には、キーワード引数として指定された追加の属性が含まれています。

tag

この要素が表すデータの種類(つまり、要素タイプ)を識別する文字列。

text
tail

これらの属性を使用して、要素に関連付けられた追加のデータを保持できます。 それらの値は通常文字列ですが、アプリケーション固有のオブジェクトでもかまいません。 要素がXMLファイルから作成されている場合、 text 属性は、要素の開始タグとその最初の子または終了タグの間のテキスト、またはNoneテールのいずれかを保持します属性は、要素の終了タグと次のタグの間のテキスト、またはNoneのいずれかを保持します。 XMLデータの場合

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

a 要素には text 属性と tail 属性の両方にNoneがあり、 b 要素には text [ X125X] "1"および tail "4"c 要素には text "2"およびがありますtail None、および d 要素には text Noneおよび tail "3"があります。

要素の内部テキストを収集するには、 itertext()、たとえば"".join(element.itertext())を参照してください。

アプリケーションは、これらの属性に任意のオブジェクトを格納できます。

attrib

要素の属性を含む辞書。 attrib 値は常に実際の可変Pythonディクショナリですが、ElementTree実装は別の内部表現を使用することを選択し、誰かが要求した場合にのみディクショナリを作成することに注意してください。 このような実装を利用するには、可能な限り以下の辞書メソッドを使用してください。

次の辞書のようなメソッドは、要素の属性で機能します。

clear()

要素をリセットします。 この関数は、すべてのサブ要素を削除し、すべての属性をクリアし、テキストとテールの属性をNoneに設定します。

get(key, default=None)

key という名前の要素属性を取得します。

属性値を返します。属性が見つからなかった場合は default を返します。

items()

要素の属性を(名前、値)ペアのシーケンスとして返します。 属性は任意の順序で返されます。

keys()

要素の属性名をリストとして返します。 名前は任意の順序で返されます。

set(key, value)

要素の属性 keyvalue に設定します。

次のメソッドは、要素の子(サブ要素)で機能します。

append(subelement)

この要素のサブ要素の内部リストの最後に要素 subelement を追加します。

extend(subelements)

0個以上の要素を持つシーケンスオブジェクトからサブ要素を追加します。 サブ要素が有効なオブジェクトでない場合、AssertionErrorを発生させます。

バージョン2.7の新機能。

find(match)

match に一致する最初のサブ要素を検索します。 match は、タグ名またはパスの場合があります。 要素インスタンスまたはNoneを返します。

findall(match)

タグ名またはパスで、一致するすべてのサブ要素を検索します。 一致するすべての要素をドキュメント順に含むリストを返します。

findtext(match, default=None)

match に一致する最初のサブ要素のテキストを検索します。 match は、タグ名またはパスの場合があります。 最初に一致する要素のテキストコンテンツを返します。要素が見つからなかった場合は default を返します。 一致する要素にテキストコンテンツがない場合は、空の文字列が返されることに注意してください。

getchildren()

バージョン2.7以降非推奨: list(elem)またはイテレーションを使用してください。

getiterator(tag=None)

バージョン2.7以降非推奨:代わりにメソッド Element.iter()を使用してください。

insert(index, element)

この要素の指定された位置にサブ要素を挿入します。

iter(tag=None)

現在の要素をルートとしてツリー iterator を作成します。 イテレータは、この要素とその下のすべての要素をドキュメント(深さ優先)の順序で繰り返します。 tagNoneまたは'*'でない場合、タグが tag と等しい要素のみがイテレーターから返されます。 反復中にツリー構造が変更された場合、結果は未定義です。

バージョン2.7の新機能。

iterfind(match)

タグ名またはパスで、一致するすべてのサブ要素を検索します。 一致するすべての要素をドキュメント順に生成する反復可能オブジェクトを返します。

バージョン2.7の新機能。

itertext()

テキストイテレータを作成します。 イテレータは、この要素とすべてのサブ要素をドキュメント順にループし、すべての内部テキストを返します。

バージョン2.7の新機能。

makeelement(tag, attrib)

この要素と同じタイプの新しい要素オブジェクトを作成します。 このメソッドを呼び出さないでください。代わりに SubElement()ファクトリ関数を使用してください。

remove(subelement)

要素からサブ要素を削除します。 find *メソッドとは異なり、このメソッドは、タグ値やコンテンツではなく、インスタンスIDに基づいて要素を比較します。

Element オブジェクトは、サブ要素を操作するための次のシーケンスタイプメソッドもサポートします: __ delitem __()__ getitem __()__ setitem __()__ len __()

注意:サブ要素のない要素は、Falseとしてテストされます。 この動作は、将来のバージョンで変更される予定です。 代わりに、特定のlen(elem)またはelem is Noneテストを使用してください。

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"


19.7.3.3。 ElementTreeオブジェクト

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

ElementTreeラッパークラス。 このクラスは要素階層全体を表し、標準XMLとの間のシリアル化のサポートを追加します。

element はルート要素です。 指定されている場合、ツリーはXML ファイルの内容で初期化されます。

_setroot(element)

このツリーのルート要素を置き換えます。 これにより、ツリーの現在の内容が破棄され、指定された要素に置き換えられます。 注意して使用してください。 element は要素インスタンスです。

find(match)

Element.find()と同じで、ツリーのルートから始まります。

findall(match)

Element.findall()と同じで、ツリーのルートから始まります。

findtext(match, default=None)

Element.findtext()と同じで、ツリーのルートから始まります。

getiterator(tag=None)

バージョン2.7以降非推奨:代わりにメソッド ElementTree.iter()を使用してください。

getroot()

このツリーのルート要素を返します。

iter(tag=None)

ルート要素のツリーイテレータを作成して返します。 イテレータは、このツリー内のすべての要素をセクション順にループします。 tag は検索するタグです(デフォルトではすべての要素を返します)。

iterfind(match)

タグ名またはパスで、一致するすべてのサブ要素を検索します。 getroot()。iterfind(match)と同じです。 一致するすべての要素をドキュメント順に生成する反復可能オブジェクトを返します。

バージョン2.7の新機能。

parse(source, parser=None)

この要素ツリーに外部XMLセクションをロードします。 source は、ファイル名またはファイルオブジェクトです。 parser は、オプションのパーサーインスタンスです。 指定しない場合は、標準のXMLParserパーサーが使用されます。 セクションルート要素を返します。

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

要素ツリーをXMLとしてファイルに書き込みます。 file は、ファイル名、または書き込み用に開かれたファイルオブジェクトです。 encoding 1 は出力エンコーディングです(デフォルトはUS-ASCIIです)。 xml_declaration は、XML宣言をファイルに追加する必要があるかどうかを制御します。 Falseを使用しない場合、Trueを常に使用する場合、Noneを使用するのは、US-ASCIIまたはUTF-8でない場合のみです(デフォルトはNone)。 default_namespace は、デフォルトのXML名前空間(「xmlns」の場合)を設定します。 メソッドは、"xml""html"、または"text"のいずれかです(デフォルトは"xml")。 エンコードされた文字列を返します。

これは、操作される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>

最初の段落のすべてのリンクの属性「ターゲット」を変更する例:

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

19.7.3.4。 QNameオブジェクト

class xml.etree.ElementTree.QName(text_or_uri, tag=None)
QNameラッパー。 これは、出力で適切な名前空間処理を取得するために、QName属性値をラップするために使用できます。 text_or_uri は、{uri} localの形式のQName値を含む文字列です。タグ引数が指定されている場合は、QNameのURI部分です。 tag が指定されている場合、最初の引数はURIとして解釈され、この引数はローカル名として解釈されます。 QName インスタンスは不透明です。


19.7.3.5。 TreeBuilderオブジェクト

class xml.etree.ElementTree.TreeBuilder(element_factory=None)

一般的な要素構造ビルダー。 このビルダーは、start、data、およびendメソッド呼び出しのシーケンスを整形式の要素構造に変換します。 このクラスを使用して、カスタムXMLパーサー、または他のXMLのような形式のパーサーを使用して要素構造を構築できます。 element_factory は、指定されたときに新しい Element インスタンスを作成するために呼び出されます。

close()

ビルダーバッファをフラッシュし、最上位のドキュメント要素を返します。 Element インスタンスを返します。

data(data)

現在の要素にテキストを追加します。 data は文字列です。 これは、バイト文字列またはUnicode文字列のいずれかである必要があります。

end(tag)

現在の要素を閉じます。 tag は要素名です。 閉じた要素を返します。

start(tag, attrs)

新しい要素を開きます。 tag は要素名です。 attrs は、要素属性を含む辞書です。 開いた要素を返します。

さらに、カスタム TreeBuilder オブジェクトは、次のメソッドを提供できます。

doctype(name, pubid, system)

Doctype宣言を処理します。 name はDoctype名です。 pubid は公開識別子です。 system はシステム識別子です。 このメソッドは、デフォルトの TreeBuilder クラスには存在しません。

バージョン2.7の新機能。


19.7.3.6。 XMLParserオブジェクト

class xml.etree.ElementTree.XMLParser(html=0, target=None, encoding=None)

expatパーサーに基づくXMLソースデータ用の Element 構造ビルダー。 html は事前定義されたHTMLエンティティです。 このフラグは、現在の実装ではサポートされていません。 target はターゲットオブジェクトです。 省略した場合、ビルダーは標準のTreeBuilderクラスのインスタンスを使用します。 エンコーディング 1 はオプションです。 指定した場合、値はXMLファイルで指定されたエンコーディングをオーバーライドします。

close()

パーサーへのデータの供給を終了します。 要素構造を返します。

doctype(name, pubid, system)

バージョン2.7以降非推奨:カスタムTreeBuilderターゲットで TreeBuilder.doctype()メソッドを定義します。

feed(data)

データをパーサーにフィードします。 data はエンコードされたデータです。

XMLParser.feed()は、開始タグごとに target ' s start()メソッド、終了タグごとにend()メソッド、およびデータを呼び出します。メソッドdata()によって処理されます。 XMLParser.close()は、 target 'のメソッドclose()を呼び出します。 XMLParser は、ツリー構造の構築だけでなく使用できます。 これは、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

脚注

11234
XML出力に含まれるエンコーディング文字列は、適切な標準に準拠している必要があります。 たとえば、「UTF-8」は有効ですが、「UTF8」は無効です。 https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDeclおよび https://www.iana.org/assignments/character-setsを参照してください。 /character-sets.xhtml