Blow Up by Black Swan

GAS(Google Apps Script)ーGoogle Apps Script(GAS)でxmlを解析した時に引っかかったこと

今回、Google Apps Script(GAS)を使って、xmlを解析してみたのですが、その時にうまくいかず解決するのに時間がかかりました。この記事ではその躓きと対処法についてまとめました。短いですが、参考になりましたら幸いです。

1. はじめに

今回のプログラムの目的は、xmlファイルを解析し、そこから必要な情報を取り出してスプレッドシートにまとめることでした。対象とするxmlファイルは以下になります。Googleマップのマイマップデータをkmlでダウンロードし、xmlに拡張子を変更したものになります。kmlについては、今回初めてその存在を知りました。詳細は下記のサイトを参考にして下さい。

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
  <Document>
    <name>My Castles</name>
    <Style id="icon-************-normal">
      <IconStyle>
        <color>ffd18802</color>
        <scale>1</scale>
        <Icon>
          <href>images/icon-1.png</href>
        </Icon>
      </IconStyle>
      <LabelStyle>
        <scale>0</scale>
      </LabelStyle>
    </Style>
    <Style id="icon-**********-highlight">
      <IconStyle>

(省略)

    </Style>
    <StyleMap id="icon-*******************">
      <Pair>
        <key>normal</key>
        <styleUrl>#icon-*******************-normal</styleUrl>
      </Pair>
      <Pair>
        <key>highlight</key>
        <styleUrl>#icon-*******************-highlight</styleUrl>
      </Pair>
    </StyleMap>
    <Placemark>
      <name>五稜郭</name>
      <description>2017年</description>
      <styleUrl>#icon-*******************</styleUrl>
      <Point>
        <coordinates>
          140.7569254,41.7976385,0
        </coordinates>
      </Point>
    </Placemark>

(省略)

  </Document>
</kml>

2. つまずいた点と対処法

2-1. つまずいた点

GASではxmlファイルを解析する専用ライブラリが標準で組み込まれています(XML Service – Google Apps Script)。この下記の参考サイトをもとにxmlを解析するプログラムを書きました。

つまずいたポイントは、namespace(名前空間)の指定です。今回のxmlファイルはnamespaceに名前がついていないため、全てデフォルトで指定されているものと考えプログラムを組んでいました。しかし、これではxmlファイルが正しく解析されず、データが取れませんでした。

2-2. 解決策

この問題はシンプルにnamespaceを指定することで解決しました。名前を取得する場合は下記のようになります。デフォルトのURLを明示的に指定しています。今回のプログラムでは、対象のファイルの取得部分は省略しており、xmlデータを解析する部分から記載しています。

var xmlDocs = XmlService.parse(<xmlデータ>);
var ns = XmlService.getNamespace("", "http://www.opengis.net/kml/2.2");
var doc = xmlDocs.getRootElement().getChild('Document', ns);
var fileName = doc.getChildText('name', ns);

最初は、namespaceを省いたせいで躓きましたが、これで必要な情報を取得することができました。

3. まとめ

以上がGASでxmlを解析する際の注意点とその対策です。デフォルトの名前空間については、わざわざnamespaceを指定する必要がない場合もあるようですが、今回は入れたことで解決しました。他のブログでも注意事項として書かれていることではありますが、改めて注意して頂ければと思います。読んで頂き、ありがとうございます。この記事が参考になりましたら、幸いです。