【Python】XMLを読み取りするパターン(ElementTree)

スポンサーリンク

Pythonでは、XMLのデータを読み取りすることができます。

XMLを取得して読み取るには、「xml.etree.ElementTree」モジュールを使います。

今回は、PythonでXMLを読み取りするxml.etree.ElementTree モジュールの使い方を解説します。

PythonでXMLを読み取る

サンプルXML

sports1.xml (属性なし)

<?xml version="1.0" encoding="UTF-8" ?>
<sports>
  <sport>
    <name>サッカー</name>
    <orgin>イングランド</orgin>
  </sport>
  <sport>
    <name>野球</name>
    <orgin>アメリカ</orgin>
  </sport>
</sports>

sports2.xml(属性あり)

<?xml version="1.0" encoding="UTF-8" ?>
<sports>
  <sport order="001">
    <name>サッカー</name>
    <orgin>イングランド</orgin>
  </sport>
  <sport order="002">
    <name>野球</name>
    <orgin>アメリカ</orgin>
  </sport>
</sports>

XMLのサンプルとして、「属性あり」と「属性なし」の2パターンを用意しました。

XMLを解析する

PythonでXMLを読み取るには、「解析」→「要素・データ取得」という流れになります。XMLを解析する方法は2パターンあります。

  1. XMLファイル
  2. XMLデータ(変数)

1.XMLファイルを解析する

import xml.etree.ElementTree as ET 

# XMLファイルを解析
tree = ET.parse('c:\\pg\sports1.xml') 

# XMLを取得
root = tree.getroot()

まず最初に「XMLファイル」を読み取るパターンです。

PythonでXMLを扱うには、「xml.etree.ElementTree」をインポートします。

「parse」でXMLを解析します。パラメータはファイルのパスです。その結果を「getroot」で取得しルート変数「root」へ格納します。

2.XMLデータを解析する

import xml.etree.ElementTree as ET 

# XMLを取得
root = ET.fromstring(sports_xml)

次はファイルではなく、XMLデータを読み取るパターンです。XMLが変数に入っているパターンです。

PythonでXMLを扱うには、「xml.etree.ElementTree」をインポートします。

XMLの構造がそのままセットされた変数「sports_xml」を「fromstring」のパラメータにセットします。解析した結果がルート変数「root」へ格納されます。

 

XML 子要素を取得する

# 子要素を取得する
for child in root:
    print(child.tag, child.attrib)

#[sports1.xmlの結果] sport {}
#[sports1.xmlの結果] sport {}

#[sports2.xmlの結果] sport {'order': '001'}
#[sports2.xmlの結果] sport {'order': '002'}

子要素を取得するには、XMLを「getroot」で取得したルート変数「root」を「for in」で1つずつ取り出します。

  • 「tag」・・・子要素のタグ
  • 「attrib」・・・子要素の属性

属性がない「sports1.xml」は「attrib」で取得できませんでした。

要素名を指定してデータを取得する

# 要素「name」のデータを1つずつ取得
for name in root.iter('name'):
    print(name.text)

#[結果] サッカー
#[結果] 野球

XMLの要素名を指定して取り出すこともできます。ここでは要素名「name」のデータを取得します。

ルート変数「root」の「iter」に要素名をパラメータとしてセットして1つずつ取り出しました。実際のデータ(コンテンツ)は「text」で取得できます。

配列でデータを取得する

# 配列でデータを1つずつ取得
print(root[0][0].text)
print(root[0][1].text)
print(root[1][0].text)
print(root[1][1].text)
#[結果] サッカー
#[結果] イングランド
#[結果] 野球
#[結果] アメリカ

先ほどは要素名を指定してデータを取り出しましたが、ここでは上から順番に取得します。

ルート変数「root」の配列番号で指定して取り出すことができます。「00」は1つ目のデータ、「01」が2つ目のデータという感じです。

 

参照ページhttps://docs.python.jp/3/library/xml.etree.elementtree.html

以上、PythonでXMLを読み取りする「xml.etree.ElementTree」モジュールの使い方でした。

コメント