サーチ…


備考

XML入力のすべての要素が、解析されたツリーの要素として終わるわけではありません。現在、このモジュールは、XMLコメント、処理命令、および入力内の文書型宣言をスキップします。それにもかかわらず、XMLテキストから解析するのではなく、このモジュールのAPIを使用して構築されたツリーはコメントと処理命令を持つことができます。 XML出力を生成するときにインクルードされます。

ElementTreeを使ったオープニングと読み込み

ElementTreeオブジェクトをインポートし、関連する.xmlファイルを開き、ルートタグを取得します。

import xml.etree.ElementTree as ET
tree = ET.parse("yourXMLfile.xml")
root = tree.getroot()

ツリーを検索する方法はいくつかあります。最初は反復によるものです:

for child in root:
    print(child.tag, child.attrib)

それ以外の場合は、リストのような特定の場所を参照することができます:

print(root[0][1].text)

特定のタグを名前で検索するには、 .findまたは.findall使用します。

print(root.findall("myTag"))
print(root[0].find("myOtherTag"))

XMLファイルの変更

要素ツリーモジュールをインポートしてxmlファイルを開き、xml要素を取得する

import xml.etree.ElementTree as ET
tree = ET.parse('sample.xml')
root=tree.getroot()
element = root[0] #get first child of root element

要素オブジェクトは、フィールドの変更、属性の追加と変更、子の追加と削除によって操作できます

element.set('attribute_name', 'attribute_value') #set the attribute to xml element
element.text="string_text"

要素を削除する場合は、Element.remove()メソッドを使用します。

root.remove(element)

ElementTree.write()メソッドは、XMLオブジェクトをXMLファイルに出力するために使用されます。

tree.write('output.xml')

XML文書の作成と構築

要素ツリーのインポートモジュール

import xml.etree.ElementTree as ET

Element()関数を使用してXML要素を作成する

p=ET.Element('parent')

要素を与えるためにサブ要素を作成するために使用されるSubElement()関数

c = ET.SubElement(p, 'child1')

dump()関数は、xml要素をダンプするために使用されます。

ET.dump(p)
# Output will be like this
#<parent><child1 /></parent>

ファイルに保存する場合は、ElementTree()関数を使用してxmlツリーを作成し、ファイルに保存するにはwrite()メソッドを使用します

tree = ET.ElementTree(p)
tree.write("output.xml")

Comment()関数は、xmlファイルにコメントを挿入するために使用されます。

comment = ET.Comment('user comment')
p.append(comment) #this comment will be appended to parent element

iterparse(インクリメンタル解析)を使用して大規模なXMLファイルを開き読み込む

場合によっては、必要な情報を得るためにXMLファイル全体をロードしたくない場合もあります。これらのインスタンスでは、関連するセクションを徐々にロードしてから終了すると削除することができます。 iterparse関数を使用すると、XMLの解析中に格納されている要素ツリーを編集できます。

ElementTreeオブジェクトをインポートします。

import xml.etree.ElementTree as ET

.xmlファイルを開き、すべての要素を反復処理します。

for event, elem in ET.iterparse("yourXMLfile.xml"):
    ... do something ...

また、開始タグや終了タグ​​、名前空間などの特定のイベントのみを検索することもできます。このオプションを省略した場合(上のように)、「終了」イベントだけが返されます。

events=("start", "end", "start-ns", "end-ns")
for event, elem in ET.iterparse("yourXMLfile.xml", events=events):
    ... do something ...

ここでは、メモリ内のツリーから要素をクリアする方法を示す完全な例を示します。

for event, elem in ET.iterparse("yourXMLfile.xml", events=("start","end")):        
    if elem.tag == "record_tag" and event == "end":
        print elem.text
        elem.clear()
    ... do something else ...

XPathでXMLを検索する

バージョン2.7からElementTreeはXPathクエリをよりよくサポートしています。 XPathは、データベースを検索するために使用されるSQLのようなxmlをナビゲートするための構文です。 findall関数とfindall関数の両方find XPathをサポートしています。この例では、以下のxmlが使用されます

 <Catalog>
    <Books>
        <Book id="1" price="7.95">
            <Title>Do Androids Dream of Electric Sheep?</Title>
            <Author>Philip K. Dick</Author>
        </Book>
        <Book id="5" price="5.95">
            <Title>The Colour of Magic</Title>
            <Author>Terry Pratchett</Author>
        </Book>
        <Book id="7" price="6.95">
            <Title>The Eye of The World</Title>
            <Author>Robert Jordan</Author>
        </Book>
    </Books>
</Catalog>

すべての書籍を検索する:

import xml.etree.cElementTree as ET
tree = ET.parse('sample.xml')
tree.findall('Books/Book')

title = 'The Magic of Color'の本を検索する:

tree.find("Books/Book[Title='The Colour of Magic']") 
# always use '' in the right side of the comparison

id = 5の本を検索する:

tree.find("Books/Book[@id='5']")
# searches with xml attributes must have '@' before the name

第2の本を探してください:

tree.find("Books/Book[2]")
# indexes starts at 1, not 0

最後の本を検索する:

tree.find("Books/Book[last()]")
# 'last' is the only xpath function allowed in ElementTree

すべての著者を検索する:

tree.findall(".//Author")
#searches with // must use a relative path


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow