令和の時代になっても、XMLがダラダラと公開されています。
特に、システム改修がなされない環境ではそうでしょう。
例えば、公的機関の公開するデータです。
また、影響範囲の大きい連携システム(EDIなど)もXMLのままでしょう。
そのXMLは、これまた扱うのが面倒なのですよね。
「jsonのように扱うことができればいいのに」と何度も思ったことです。
それが、xmltodictを使えば簡単に実現できます。
本記事の内容
- xmltodictとは?
- xmltodictのシステム要件
- xmltodictのインストール
- xmltodictの動作確認
それでは、上記に沿って解説していきましょう。
xmltodictとは?
xmltodictは、Pythonのライブラリです。
名前の通りに、XMLをdict型(辞書型)のデータに変換します。
dict型データであれば、jsonのように処理が可能となります。
地味な機能ですが、何気にプログラミングの生産性を向上できます。
そもそも、XML自体が中途半端な立ち位置です。
ある程度普及したが故に、未だに存在しているという状況です。
そして、まれにXMLを扱うケースに出会います。
その度に、「Python XML」などで調べることになります。
もう、こんなことは終わりにしましょう。
そのためにxmltodictを利用するのです。
XML対応の最終兵器となるxmltodicは、簡単に導入できるのでしょうか?
それを把握するために、xmltodictのシステム要件を確認しましょう。
xmltodictのシステム要件
現時点では、xmltodictの最新バージョンが0.12.0となります。
この最新バージョンが公開されたのは、2019年1月11日です。
更新は、それほど活発ではありませんね。
でも、それだけ完成度が高いのかもしれません。
サポートOSに関しては、以下を含むクロスプラットフォーム対応です。
- Windows
- macOS
- Linux
基本的には、Pythonさえ動けばどこでも動くということですね。
サポート対象となるPythonのバージョンは、少し注意が必要となります。
公式で記載されているバージョンは、以下です。
- Python 2.7
- Python 3.4
- Python 3.5
- Python 3.6
- Python 3.7
ここには、Python 3.8と3.9がありません。
でも、安心してください。
これは、更新頻度の低いライブラリあるあるです。
複雑な処理(機械学習絡み)でなければ、大抵は動きます。
実際、私は以下のバージョンで検証しています。
>python -V Python 3.9.1
問題なくxmltodictを動かすことができています。
以上、xmltodictのシステム要件を説明しました。
次は、xmltodictをインストールしていきましょう。
xmltodictのインストール
最初に、現状のインストール済みパッケージを確認しておきます。
>pip list Package Version ---------- ------- pip 21.0.1 setuptools 54.1.1
次にするべきことは、pip自体の更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。
python -m pip install --upgrade pip
では、xmltodictのインストールです。
xmltodictのインストールは、以下のコマンドとなります。
pip install xmltodict
インストールは、すぐに終わります。
では、どんなパッケージがインストールされたのかを確認しましょう。
>pip list Package Version ---------- ------- pip 21.0.1 setuptools 54.1.1 xmltodict 0.12.0
xmltodict は、最新バージョンがインストールされています。
依存関係のあるパッケージは、ありません。
そのため、xmltodictを気軽に導入できます。
以上、xmltodict のインストールが完了しました。
次は、xmltodictの動作確認を行いましょう。
xmltodictの動作確認
動作確認をするために、まずはXMLファイルを用意しましょう。
text.xml
<?xml version="1.0" encoding="UTF-8"?> <Report xmlns="http://xml.kishou.go.jp/jmaxml1/" xmlns:jmx="http://xml.kishou.go.jp/jmaxml1/"> <Control> <Title>季節観測</Title> <DateTime>2009-01-09T02:02:05Z</DateTime> <Status>通常</Status> <EditorialOffice>熊谷地方気象台</EditorialOffice> <PublishingOffice>熊谷地方気象台</PublishingOffice> </Control> <Head xmlns="http://xml.kishou.go.jp/jmaxml1/informationBasis1/"> <Title>季節観測</Title> <ReportDateTime>2009-01-09T11:00:00+09:00</ReportDateTime> <TargetDateTime>2009-01-09T00:00:00+09:00</TargetDateTime> <EventID>20090109110000_初雪</EventID> <InfoType>発表</InfoType> <Serial /> <InfoKind>特殊気象報</InfoKind> <InfoKindVersion>1.0_0</InfoKindVersion> <Headline> <Text /> </Headline> </Head> <Body xmlns="http://xml.kishou.go.jp/jmaxml1/body/meteorology1/"> <MeteorologicalInfos type="季節観測"> <MeteorologicalInfo> <DateTime significant="yyyy-mm-dd">2009-01-09T00:00:00+09:00</DateTime> <Item> <Kind> <Name>初雪</Name> </Kind> <Station> <Name>熊谷地方気象台</Name> <Code type="国際地点番号">47626</Code> <Location>熊谷市桜町</Location> </Station> </Item> </MeteorologicalInfo> </MeteorologicalInfos> <AdditionalInfo> <ObservationAddition> <DeviationFromNormal>-9</DeviationFromNormal> <DeviationFromLastYear>7</DeviationFromLastYear> </ObservationAddition> </AdditionalInfo> </Body> </Report>
上記XMLは、気象庁からダウンロードしたモノです。
公的機関では、いまだにXMLでのデータ公開というパターンを目にします。
このXMLをdict型データに変換するコードは、以下。
import xmltodict # XMLファイルの処理 with open('test.xml', encoding='utf-8') as fp: # xml読み込み xml_data = fp.read() # xml → dict dict_data = xmltodict.parse(xml_data) print(dict_data)
上記プログラムを実行すると、以下が表示されます。
OrderedDict([('Report', OrderedDict([('@xmlns', 'http://xml.kishou.go.jp/jmaxml1/'), ('@xmlns:jmx', 'http://xml.kishou.go.jp/jmaxml1/'), ('Control', OrderedDict([('Title', '季節観測'), ('DateTime', '2009-01-09T02:02:05Z'), ('Status', '通常'), ('EditorialOffice', '熊谷地方気象台'), ('PublishingOffice', '熊谷地方気象台')])), ('Head', OrderedDict([('@xmlns', 'http://xml.kishou.go.jp/jmaxml1/informationBasis1/'), ('Title', '季節観測'), ('ReportDateTime', '2009-01-09T11:00:00+09:00'), ('TargetDateTime', '2009-01-09T00:00:00+09:00'), ('EventID', '20090109110000_初雪'), ('InfoType', '発表'), ('Serial', None), ('InfoKind', '特殊気象報'), ('InfoKindVersion', '1.0_0'), ('Headline', OrderedDict([('Text', None)]))])), ('Body', OrderedDict([('@xmlns', 'http://xml.kishou.go.jp/jmaxml1/body/meteorology1/'), ('MeteorologicalInfos', OrderedDict([('@type', '季節観測'), ('MeteorologicalInfo', OrderedDict([('DateTime', OrderedDict([('@significant', 'yyyy-mm-dd'), ('#text', '2009-01-09T00:00:00+09:00')])), ('Item', OrderedDict([('Kind', OrderedDict([('Name', '初雪')])), ('Station', OrderedDict([('Name', '熊谷地方気象台'), ('Code', OrderedDict([('@type', '国際地点番号'), ('#text', '47626')])), ('Location', '熊谷市桜町')]))]))]))])), ('AdditionalInfo', OrderedDict([('ObservationAddition', OrderedDict([('DeviationFromNormal', '-9'), ('DeviationFromLastYear', '7')]))]))]))]))])
見事に辞書型になっています。
これでXMLをjsonデータのように扱うことが可能になりました。
以上、xmltodictの動作確認でした。