XML: 名前空間(Name Space)のあるXML, コロンがタグに入ってるXML

2018年7月5日namespace, xml, 名前空間

    みなさん、こんにちは。ファイルの参照を行うプログラムを書いていて、なかなか実行できず、何で!?って思ってたらただ参照ファイル名が間違ってただけだったPQTomです。
    今日はXMLファイルについて話したいと思います。
    最近XMLファイルを扱うことが多く、いろんなサイトを参照しながらデータの取得を行なっているのですが、自分の使ってるXMLファイルが特殊なのか、なかなか思うような検索結果が得られずに困っていたので、そのなかでも、何とかして手に入れた情報をまとめたので紹介します。

    XMLファイルとは

    XMLとはExtensible Markup Languageの略です。
    そのまま日本語に直訳すると拡張マークアップ言語ってことになります。
    この時のマークアップとは情報をコンピュータが理解できるようにタグを使用してわかりやすくすることを指します。
    つまり、この情報はどんな情報なのかってことの目印をつけることですね。
    XMLはよく情報の管理に使用されます。
    よくオープンデータとして公開されるデータはXMLを使用していることが多いです。(JSONファイルと)
    なので、オープンデータを使用したシステム開発や研究を行う時にはこのXMLの知識は必ずと言っていいほど必要になってきます。

    XMLってどんなもの

    XMLの例を見ていきましょう

    例1.

    <?xml version="1.0">
    <univstudents>
      <student>
        <name>スズキ</name>
        <number>1</number>
        <tall>175</tall>
        <club>サッカー</club>
      </student>
      <student>
        <name>サトウ</name>
        <number>2</number>
        <tall>180</tall>
        <club>籠球</club>
      </student>
    </univstudents>

    こんな感じでXMLは書かれています。
    学校の学生、名前、番号、身長、クラブのデータです。
    一つ一つ見ていけば簡単にわかるので長いものでも落ち着いて一つ一つみて解読しましょう。
    基本、オープンデータには説明書きがあるはずなのでそっちをみればどんなファイルか簡単にわかり、あとは必要な情報のタグを探せばオッケーです。
    形式的になっているので最初のデータのタグを見てあとは同じタグで情報が記載されているんだなって思ってまず問題ないです。

    特殊なXML(名前空間入り)

    普通のXMLファイルならタグからその情報を簡単に取得できるのですが、名前空間があるXMLファイルだとデータの取得の際、ちょっとした工夫が必要になります。

    例2.

    <?xml version="1.0" encoding="utf-8"?>
    <ksj:Dataset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ksj="http://nlftp.mlit.go.jp/ksj/schemas/ksj-app" gml:id="P20Dataset" xsi:schemaLocation="http://nlftp.mlit.go.jp/ksj/schemas/ksj-app KsjAppSchema-P20-v1_0.xsd">
    <gml:description>国土数値情報 避難施設 インスタンス文書</gml:description>
    <gml:boundedBy>
    <gml:EnvelopeWithTimePeriod srsName="JGD2000 / (B, L)" frame="GC / JST">
    <gml:lowerCorner>20.0 123.0</gml:lowerCorner>
    <gml:upperCorner>46.0 154.0</gml:upperCorner>
    <gml:beginPosition calendarEraName="西暦">1900</gml:beginPosition>
    <gml:endPosition indeterminatePosition="unknown"/>
    </gml:EnvelopeWithTimePeriod>
    </gml:boundedBy>

    この例は国土数値情報が提供している情報の一部です。
    タグの中に:が含まれているのがわかります。
    この:の前にあるところが名前空間(namespace)と呼ばれるところになります。
    <gml:description>というタグがありますが、このgmlというところが名前空間で上部の

    xmlns:gml="http://www.opengis.net/gml/3.2"

    と対応していて、データの取得にはこのURLを明記しないといけないという点で普通のXMLとは違います。
    なので名前空間があるXMLはpythonやphpでこのデータをパースし取得するときにちょっとした工夫が必要となります。
    僕は、このデータをcsvに変換し、データベースへ格納する時、pythonのElementTreeというライブラリを使用してデータを取得しました。
    実際に行なったデータの取得はまたの機会に話したいと思います。

    まとめ

    今回XMLについてちょっと話しました。
    :がタグの中に入ったものを検索するとなかなかひっかからず、探すのが難しかったのですが、名前空間という言葉だけでも知っていればすぐにデータ収集のための情報が手に入ったので知っているって大事だなと感じました。
    XMLデータのパースについては後日、話しますが、知りたい人は僕が使ったライブラリのホームページへのリンクを最後に貼って置くので先に実行して試してみてはいかかでしょう。

    では今日はこのへんで
    ではでは。

    参考

    xml.etree.ElementTree – ElementTree XML API, https://docs.python.jp/3/library/xml.etree.elementtree.html