見出し画像

note でエクスポートしたXMLをPythonで読みやすくしたい(その2)

さて。
こちらの続きです。

(1)XMLファイルを読み込む
(2)読み込んだデータを木構造でアクセスする

前回やったのはここまで。

今回は、木構造の中身のデータを表示してみようと思います。


「Element.tag」を表示する関数を用意する

まず、「Element」を表示する関数を用意しておきます。ついでに、「Element」そのものを表示するのではなく、「Element.tag」を表示します。

すると、こんな感じ。

import xml.etree.ElementTree as ET
tree = ET.parse('country_data.xml')
root = tree.getroot()

def show_element(el):
    print(el.tag)

def show_child(el):
    for child in el:
        show_element(child)
        show_child(child)

show_child(root)

実行するとこんな感じになります。

country
rank
year
gdppc
neighbor
neighbor
country
rank
year
gdppc
neighbor
country
rank
year
gdppc
neighbor
neighbor

ここでは各「Element」の「tag」が表示されています。
tag」というのはココですね。
この赤字の部分です。

XML の tag(タグ)

でも、tagだけの表示じゃあ、さっぱりわからん。
もう少し表示してみます。


「attrib」と「text」を表示する

attrib」と「text」もあわせて表示してみます。

import xml.etree.ElementTree as ET
tree = ET.parse('country_data.xml')
root = tree.getroot()

def show_element(el):
    print(el.tag, el.attrib, el.text)

def show_child(el):
    for child in el:
        show_element(child)
        show_child(child)

show_child(root)

結果、次のようになります。

country {'name': 'Liechtenstein'} 
        
rank {} 1
year {} 2008
gdppc {} 141100
neighbor {'name': 'Austria', 'direction': 'E'} None
neighbor {'name': 'Switzerland', 'direction': 'W'} None
country {'name': 'Singapore'} 
        
rank {} 4
year {} 2011
gdppc {} 59900
neighbor {'name': 'Malaysia', 'direction': 'N'} None
country {'name': 'Panama'} 
        
rank {} 68
year {} 2011
gdppc {} 13600
neighbor {'name': 'Costa Rica', 'direction': 'W'} None
neighbor {'name': 'Colombia', 'direction': 'E'} None

国名やランクが具体的に表示されるようになりました。


木構造のレベルを表示する

ただ、これだと木構造のどのレベルにいるのかわからない。とりあえず、数字でいいからレベルを表示してみます。ついでに、root が表示されていないので表示しておきます。

import xml.etree.ElementTree as ET
tree = ET.parse('country_data.xml')
root = tree.getroot()

def show_element(level, el):
    print(level, el.tag, el.attrib, el.text)

def show_child(level, el):
    level = level + 1
    for child in el:
        show_element(level, child)
        show_child(level, child)

level = 1
show_element(level, root)
show_child(level, root)

結果は・・・。

1 data {} 
    
2 country {'name': 'Liechtenstein'} 
        
3 rank {} 1
3 year {} 2008
3 gdppc {} 141100
3 neighbor {'name': 'Austria', 'direction': 'E'} None
3 neighbor {'name': 'Switzerland', 'direction': 'W'} None
2 country {'name': 'Singapore'} 
        
3 rank {} 4
3 year {} 2011
3 gdppc {} 59900
3 neighbor {'name': 'Malaysia', 'direction': 'N'} None
2 country {'name': 'Panama'} 
        
3 rank {} 68
3 year {} 2011
3 gdppc {} 13600
3 neighbor {'name': 'Costa Rica', 'direction': 'W'} None
3 neighbor {'name': 'Colombia', 'direction': 'E'} None

ベタなテキストではありますけど、情報は全て表示できたようです。

なんですけども・・・。


改良

ちょっと、この★の部分がね、ダブっていて、なんか気持ち悪い。

def show_child(level, el):
    level = level + 1
    for child in el:
        show_element(level, child)★
        show_child(level, child)★

level = 1
show_element(level, root)★
show_child(level, root)★

なので直しておく。
となると「level = level + 1」もなくしちゃう。

そうしたら、こうなった。

import xml.etree.ElementTree as ET
tree = ET.parse('country_data.xml')
root = tree.getroot()

def show_element(level, el):
    print(level, el.tag, el.attrib, el.text)

def show_child(level, el):
    show_element(level, el)

    for child in el:
        show_child(level+1, child)

show_child(1, root)

ちょっとはすっきりしたかしらね(笑)。

次回は、note のエクスポートデータで試してみよう。


この記事が気に入ったらサポートをしてみませんか?