2018/02/19

備忘録:GoogleスプレッドシートIMPORTXML関数のXpathクエリの指定書式考察☆

■この資料の目的
Googleスプレッドシート関数IMPORTXMLの第2引数Xpathクエリに記述する内容をどうやって求めるのかを、XMLのパス記述規則から探ってみたときのメモ書き。


■対象個所の指定方法(Selecting Nodes)
nodenameはソース内の山括弧("<>")で囲われた文字で表される、セクションの名前。
//はソース内のどこかにあるパスを指定する、という接頭辞。
/は絶対パスで指定する、という接頭辞。
.は現行パスで指定する、という接頭辞。

//が階層の途中で出てきた場合には、直前(左)の階層内の任意のエレメントを指定する、という表現。
@は属性を指定する、という表現。
---
以下のXMLの場合、nodenameは、bookstore、book、title、price、が該当する。
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
  <book>
    <title lang="en">Harry Potter</title>
    <author>J K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
</bookstore>



ちなみに、HTMLに当てはめると、タグが相当する。liタグとかaタグとかimgタグとか。
---
//li/a@title
liタグで囲われたセクションの直下にあるaタグ内のtitle属性の値を返す。

//li//a@title
liタグで囲われたセクション内の任意の階層にあるaタグ内のtitle属性の値を返す。 

liタグの中にさらにliタグがある(例:表の中でさらに表が分割されている)ような場合、1つ目の指定方法では値が返ってこない。
---
a@title...HTMLのaタグ内にあるtitle属性の値を返す。
例えば、以下のようなHTMLソース(ページ)があったら、
<li id="ichigaya">
  <a href="img/index/popup_ichigaya.jpg" rel="lightbox-rally" title="JR市ケ谷駅">
  <img src="img/index/map_ichigaya.png" width="88" height="46" alt="市ケ谷">
  </a>
</li>


以下の指定により、それぞれの値が戻る。
a@href → "img/index/popup_ichigaya.jpg"
a@rel →  "lightbox-rally"
a@title → "JR市ケ谷駅"
---
とある表から1行だけ抜粋したHTMLソースを使って色々と指定してみた。なお、とある表にはJR山手線駅名情報が記述されたliタグが多数含まれている。

<li id="ichigaya">
  <a href="img/index/popup_ichigaya.jpg" rel="lightbox-rally" title="JR市ケ谷駅">
  <img src="img/index/map_ichigaya.png" width="88" height="46" alt="市ケ谷">
  </a>
</li>
 

=IMPORTXML("http://www.jr.co.jp/gr2018/","//li/@id")
戻る値は"ichigaya"。liタグに指定されている属性idに割り当てられた値。<li id="ichigaya">


=IMPORTXML("http://www.jr.co.jp/gr2018/","//li/a/@title") 
戻る値は"JR市ケ谷駅"。aタグに指定されている属性titleに割り当てられた値。<a href="img/index/popup_ichigaya.jpg" title="JR市ケ谷駅">

=IMPORTXML("http://www.jr.co.jp/gr2018/","//a[@title]//@src")
戻る値は"img/index/map_ichigaya.png"。tltle属性が記述されているaタグを対象とし、同タグ内に記述された属性srcに割り当てられた値。<img src
="img/index/map_ichigaya.png" width="88" height="46" alt="市ケ谷">
なお、この指定では、//a[@title]で対象を絞る条件を指定している。このため、tltle属性が記述されているaタグだけが選択される(=title属性がないaタグは無視されて対象外)。
また、imgタグはaタグに挟まれているのでaタグ内扱いとなる(=属性srcから値を取得できる)。
---


■不具合-漢字が文字化け
戻り値の漢字が文字化けしている。
フォントを変えても漢字にならないので、関数の内部処理でおかしな日本語文字コードに変換していると推測した。
原因/対応方法の深追いは保留中...

■出典
IMPORTXMLのヘルプで、Xpathクエリからの参照先として記載されていたサイト。
http://www.w3schools.com/xml/xpath_intro.asp
---ヘルプIMPORTXMLの詳細から一部抜粋
XPath クエリ - 構造化データで実行する XPath クエリです。
    XPath について詳しくは、http://www.w3schools.com/xml/xpath_intro.asp(英語)をご覧ください。
---


■注記

資料中のURL"http://www.jr.co.jp/gr2018/"は架空のURL。
構文確認に使用したサイトは、2018/01-02に開催されたJR東日本ガンダムスタンプラリー特設サイト。


以上☆