Pythonでは、XMLファイルを読み込んだり、解析したり、保存したりすることができます。
本記事では、PythonでXMLファイルを扱う方法をまとめて紹介します。
この記事でサンプルとするXMLファイル
この記事では以下のXMLファイルをサンプルとして、抽出方法などを紹介します。<persons>
<person name="bob">
<age>17</age>
<country>usa</country>
</person>
<person name="hanako">
<age>15</age>
<country>japan</country>
</person>
</persons>
<animal>
<dog>1</dog>
</animal>
<animal>
<cat>2</cat>
</animal>
XMLファイルの読込
XMLファイルを読み込んで、XMLデータへアクセスするためのルートオブジェクトを取得するには以下のようにします。import xml.etree.ElementTree as et
tree = et.parse(XML_FILE_PATH)
root = tree.getroot()
このルートオブジェクトやその子のオブジェクトに定義されている関数を使用することで、データの解析などが行なえます。
詳細は次以降のセクションに記載しています。
要素を抽出する
要素を抽出する方法をいくつかのケースで紹介します。タグ名で1つの要素を取得する
同一のダグが他になく、ユニークな要素の場合はfind関数でタグ名を指定することで、その要素を取得できます。冒頭のXMLの例でpersonsの要素を取得するサンプルコードは以下です。
import xml.etree.ElementTree as et
tree = et.parse(XML_FILE_PATH)
root = tree.getroot()
persons = root.find("persons")
タグ名で複数の要素を取得する
同一タグ名で複数の要素がある場合はfindall関数にタグ名を指定することで、それらの要素を取得できます。import xml.etree.ElementTree as et
tree = et.parse(XML_FILE_PATH)
root = tree.getroot()
animal_list = root.findall("animal")
for animal in animal_list:
pass #animalのなにかの処理
子の要素をすべて取得する
子の要素をすべて取得するには単純にfor-in文を使用すればOKです。以下、person要素をすべて参照するサンプルコードです。
import xml.etree.ElementTree as et
tree = et.parse(XML_FILE_PATH)
root = tree.getroot()
persons = root.find("persons")
for person in persons:
pass #personのなにかの処理
値の取得
XMLタグに囲まれた値を取得するにはXML要素に対してtextのメンバを参照します。以下、persons/person/ageの値を表示するサンプルコードです。
import xml.etree.ElementTree as et
tree = et.parse(XML_FILE_PATH)
root = tree.getroot()
persons = root.find("persons")
for person in persons:
print(person.find("age").text)
属性値の取得
先程はXMLタグに囲まれた値を取得する方法でしたが、今度はXMLタグ内に記載されている属性値の取得方法を紹介します。属性値にアクセスするにはattribメンバを参照します。
以下、personのname属性値を表示するサンプルコードです。
import xml.etree.ElementTree as et
tree = et.parse(XML_FILE_PATH)
root = tree.getroot()
persons = root.find("persons")
for person in persons:
print(person.attrib["name"])
要素の削除
要素を削除するには親要素のオブジェクトにおいて、remove関数を使用します。以下、persons/person[name=bob]を消すサンプルコードです。
import xml.etree.ElementTree as et
tree = et.parse(XML_FILE_PATH)
root = tree.getroot()
persons = root.find("persons")
for person in persons:
if person.attrib["name"] == "bob":
persons.remove(person)
注意点
要素を削除すると、以前に取得した別の要素オブジェクトの情報がズレ?るようです。そのため、要素を削除した後は他の要素を再取得しましょう。
保存
最後に保存方法です。保存にはwrite関数を使用します。
以下、サンプルコードです。
import xml.etree.ElementTree as et
tree = et.parse(XML_FILE_PATH)
root = tree.getroot()
#なにかの処理
tree.write(XML_SAVE_PATH)