<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.ElementTreeparse
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 ドキュメント

こちらを参考。

PythonでXML解析 - code snippets

おまけ。 オープンしたファイルは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))