Python で XML を使うときいろいろ忘れてるのでメモ


Python で XML パースするには、Python2.5 から標準ライブラリに入っている ElementTree を利用。

 
ElementTreeライブラリをインポート

>>> from xml.etree import ElementTree

サンプルXML(hage.xml)

<hage>
	<level name="angel" job="comedian" stat="now">6</level>
	<level name="math" job="politician" stat="former">7</level>
	<level name="blies" job="actor" stat="now">8</level>
	<level name="saitama" job="hero" stat="now">10</level>
</hage>

 

XMLファイル読み込み

>>> tree = ElementTree.parse('hage.xml')
>>> tree
<xml.etree.ElementTree.ElementTree object at 0x10c5396d0>

 

ルートノード取得

>>> root = tree.getroot()
>>> root
<Element 'hage' at 0x10c55e850>

 

ルートのタグ名取得

>>> root.tag
'hage'

 

ルートの属性取得

>>> root.attrib
{} # なし

 

子要素のタグ名取得

>>> for e in root:
... 	e.tag
'level'
'level'
'level'
'level'

 

子要素の属性取得

>>> for e in root:
... 	e.attrib 
{'stat': 'now', 'job': 'comedian', 'name': 'angel'}
{'stat': 'former', 'job': 'politician', 'name': 'math'}
{'stat': 'now', 'job': 'actor', 'name': 'blies'}
{'stat': 'now', 'job': 'hero', 'name': 'saitama'}

 

子要素の属性名を指定して値を取得

>>> for e in root:
... 	e.get('name')
'angel'
'math'
'blies'
'saitama'

 

子要素の値を取得

>>> for e in root:
... 	e.text
'6'
'7'
'8'
'10'

 

 
■ findall(タグ名) を使用する場合

>>> root.findall('level')
[<Element 'level' at 0x10c55eed0>, <Element 'level' at 0x10c55ef10>, <Element 'level' at 0x10c55efd0>, <Element 'level' at 0x10c5670d0>]

 

子要素の属性名を指定して値を取得

for e in root.findall('level'):  
... 	e.get('name')
'angel'
'math'
'blies'
'saitama'

 

子要素の値を取得

for e in root.findall('level'):  
... 	e.text
'6'
'7'
'8'
'10'

 

要素に値を書き込む

>>> root.findall('level')[1].text # 現在の値
'7'
>>> root.findall('level')[1].text= '8' # 書き換え
>>> root.findall('level')[1].text 
'8'

 

XMLファイルとして保存

>>> tree.write('hage1.xml')