0では表現の記述方法が異なります。
XPathとほかのXML規格
XPathはXSLT、XQuery、XLink、XPointer規格にも含まれています。
出典:XQeury+XMLデータベース入門(日経BP出版センター)
XQueryは文書やデータベース、WebページなどXMLデータソースを統合するクエリ言語です。図からも解るようにXPath 2.0はXQueryの基礎となる規格となっています。
PostgreSQL8.3とXPath
PostgreSQL 8.3からXPathを利用してXMLテキストから情報を取得可能になりました。PostgreSQL 8.3にはXML型のデータ型とXML型のデータを取り扱うXML関数が追加されました。XPathを利用してXML文書を検索するためにデータベースは必要ありませんが、XPathを実効する環境としてPostgreSQL 8.3を紹介します。
PostgreSQL 8.3のXML型
PostgreSQLはXML文書をテキストのまま保存せず、パースした状態のデータをXML型として保存します。XML型コラムにそのままXML文書は保存できないのでxmlparse関数を利用して変換します。
- XMLPARSE ( { DOCUMENT | CONTENT } value)
このほかにも::xmlを利用してテキストをXML型にキャストすることも可能です。詳しくは
を参照してください。
XPath関数
PostgreSQL 8.3にはXML型コラムやXMLテキストにXPath1.0のクエリを実行するxpath関数が追加されています。
- xpath(xpath, xml [, nsarray])
XMLサポートを有効にしたPostgreSQLサーバにpsqlを利用して接続すると、XPathクエリが行えることが解ります。
PostgreSQLをご存知の方なら“{bar}”、“{bar2}”と結果が配列型で返ってきていることが解ります。XMLでは同じ要素名の要素が複数あっても構わないので、PostgreSQLは配列型を返します。
XPathの基本
本記事の目的はXPathインジェクション対策が目的ですから、すべての構文は解説しませんが、次回はもう少し詳しくXPath言語を解説します。先ほどの例
の
がXPathの表現です。言葉に訳すと
“/”(ルート)以下にある“foo”要素の“text”を取得せよ
となります。先の例の場合、2つのレコードがあるので2つの結果が返ってきています。
“/”以下の要素全てを取り出すには
余計な“abc”がなくなっていますが、普通にSELECTするとデータ全体が保存されていることが分かります。
まとめ
XPathを利用すると、とても簡単にXML文書からデータを取り出せることが解ります。PostgreSQLはXQeuryはサポートしていませんが、XPath 1.0をサポートしているので基本的な操作は可能になっています。XQeuryをサポートするシステムであればFLOWR(フラワー)構文を利用してさらに高度なクエリが可能です。本連載ではXQeuryの解説は行いません。興味をお持ちの方は書籍などを参考にしてください。
次回はPHP本体に付属しているDOMモジュールのXPath関数を利用し、より複雑なXPath表現を紹介します。