【メモ】XMLパース方法
xml
個人的備忘録として、XMLのファイルを元にパースメモを記します。 document
<?xml version="1.0"?> <data> <country name="Liechtenstein"> <rank>1</rank> <year>2008</year> <gdppc>141100</gdppc> <neighbor name="Austria" direction="E"/> <neighbor name="Switzerland" direction="W"/> </country> <country name="Singapore"> <rank>4</rank> <year>2011</year> <gdppc>59900</gdppc> <neighbor name="Malaysia" direction="N"/> </country> <country name="Panama"> <rank>68</rank> <year>2011</year> <gdppc>13600</gdppc> <neighbor name="Costa Rica" direction="W"/> <neighbor name="Colombia" direction="E"/> </country> </data>
XMLファイル読み方
一行目 <?xml version="1.0"?>
の箇所は「そのテキストが XML であることを示すための宣言」です。
パースする際には無視して構わない。
二行目 <data>
は一番の要素であり、XML構造データの始まりを示している。
ルートディレクトリと呼ばれる。
三行目 <country>
はの入れ子状態となっており、子要素と呼ばれる。
parse方法
from xml.etree import ElementTree x = 'sample.xml' # 読み込むxmlファイルのパスを変数に記憶させる tree = ElementTree.parse(x) # xmlファイルを読み込む # print(tree) root = tree.getroot() # ルートを取得する print(tree.findall('country')) print(root[0][0].tag) print(root[0][0].text) # xpath *→直接の子要素 .→現在の要素 //→現在の要素配下のすべてのレベル上のすべての子要素を選択 print(tree.findall("*/rank")) print(tree.findall(".//*[@name='Singapore']")) print(tree.findall(".//")) for child in root: print(child.tag, child.attrib)
メソッド(使いそうなところだけ)
- ElementTree.parse … xmlを読み込む
- findall … 現在の要素の直接の子要素を取得 この場合、xmlを読み込んだ際はルートディレクトリから始まるので子要素はcountryタグとなる。
- 指定している要素からさらに子要素をみたい時は「*」を用いる。
- インデックス 移動する位置が面倒な場合は[i]が使える。(i:0,1…) 一個つけると、隣接した子要素のi番目の要素を指定
- 指定したnodeに複数のタグがあり、絞りたい場合は「/タグ名」で絞る。
タグの情報取得
- タグ名を表示したい場合は、指定したタグに「tag」をつける。
- 属性名を表示したい場合は、「attrb」をつける
- テキストを表示したいときは 「text」をつける