Python Language
XMLの操作
サーチ…
備考
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