<Pyhton, XML> XMLファイルを読み込む。
XMLファイルを読み込んでみる。
サンプルXMLファイル。
1 <?xml version="1.0" encoding="utf-8"?> 2 3 <Top> 4 5 <Level2nd> 6 7 <Item> 8 <Val0>Good</Val0> 9 <Val1>Hoge</Val1> 10 </Item> 11 <Item> 12 <Val0>Bad</Val0> 13 <Val1>Hage</Val1> 14 </Item> 15 <Item> 16 <Val0>Soso</Val0> 17 <Val1>Hige</Val1> 18 </Item> 19 20 <Level2nd_A> 21 <Item> 22 <Val0>Soso</Val0> 23 <Val1>Hige</Val1> 24 </Item> 25 <Item> 26 <Val0>Soso</Val0> 27 <Val1>Hige</Val1> 28 </Item> 29 </Level2nd_A> 30 31 </Level2nd> 32 33 <Level3rd> 34 <Item> 35 <Val0>Nice</Val0> 36 <Val1>PikaHage</Val1> 37 </Item> 38 <Item> 39 <Val0>Brilliant</Val0> 40 <Val1>PikapikaHage</Val1> 41 </Item> 42 </Level3rd> 43 44 </Top>
で、Python君起動。
xml.etree.ElementTree
でparse
findall()
すると、ツリーの各要素がリストのオブジェクトで返ってくる。
あとは、要素指定して、.text
すれば、文字列取り出し可。
In [2]: import xml.etree.ElementTree as ET In [3]: tree = ET.parse('test.xml') In [4]: Val0 = tree.findall('./Level2nd/Item/Val0') In [5]: Val0 Out[5]: [<Element 'Val0' at 0x000000000803E728>, <Element 'Val0' at 0x0000000007D78A48>, <Element 'Val0' at 0x000000000804F3B8>] In [6]: Val0[0].text Out[6]: 'Good' In [12]: print( [ i.text for i in Val0 ] ) ['Good', 'Bad', 'Soso']
ちなみに、トップ階層は、/
で指定。
下記のように書くと何もヒットしないよー。
In [13]: Val0 = tree.findall('./Top/Level2nd/Item/Val0') In [14]: Val0 Out[14]: []
階層が違う場合はそれなりに、パスを変更する。
In [15]: Val0 = tree.findall('./Top/Level2nd/Level2nd_A/Item/Val0') In [16]: Val0 Out[16]: [] In [17]: Val0 = tree.findall('.//Level2nd/Level2nd_A/Item/Val0') In [18]: Val0 Out[18]: [<Element 'Val0' at 0x000000000804F548>, <Element 'Val0' at 0x000000000804F638>] In [19]: print( [ i.text for i in Val0 ] ) ['Soso', 'Soso']
マニュアル。
20.5. xml.etree.ElementTree — ElementTree XML API — Python 3.4.3 ドキュメント
findall
の部分。
20.5. xml.etree.ElementTree — ElementTree XML API — Python 3.4.3 ドキュメント
こちらを参考。
おまけ。
オープンしたファイルはread()
するとストリングString
で取り込まれるので、
それを渡したければ、io.StringIO()
を使う。
In [20]: f = open('test.xml') In [21]: xml = f.read() In [22]: import io In [23]: tree = ET.parse(io.StringIO(xml))