【メモ】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」をつける

メモ xmlint

今度使ってみる。