PHP で XPath を使用する

XML を扱う際、面倒な作業を XPath に行わせる

CRUD 操作以上のことを行う PHP アプリケーションを作成したことがある方は、おそらく XML を扱ったことがあるはずです。しかし XML 文書や XML データ・ストリームをナビゲートして必要なデータ要素を検出する作業は煩雑なものになりかねず、PHP 開発者にとっては尻込みしたくなるほどかもしれません。XML データの構造が複雑な場合は、尚のこと圧倒されてしまうものです。XPath は、まさにそれを唯一の目的とした W3C の標準です。つまり XPath の目的は、適切なデータ要素 (具体的には、目的のノード) にアクセスすることにあります。PHP は XML クラスや XML 関数の一部として XPath をサポートしています。この記事では、XML の中にある情報を検出するためのいくつかの基本シナリオと、XPath が PHP アプリケーションにおける煩雑な処理をどのようにして行うのかを説明します。

2012年 5月 17日 ― 著者からの要望により、次の 2 つの更新を行いました。1) リスト 7 の全コードを置き換えました。2) リスト 8 のコード「print $xslt->transformToXML( $XML );」「print $xslt->transformToXML( $doc );」に変更しました。

Tracy Bost, Consultant and Trainer, Freelance

Author photo - Tracy BostTracy Bost はソフトウェア開発者としての長い経験を持つ、システム・エンジニアです。彼の専門はエンタープライズ・アプリケーション統合です。彼は以前、Mortgage Industry Standards Maintenance Organization (MISMO) のビジネス・ルール・ワークグループの副議長を務め、また業界標準 RuleML2010 の委員会副議長を務めました。彼は、貸付業界、不動産業界、非営利団体をはじめとするいくつかの業界で働いてきました。



2012年 6月 14日 (初版 2011年 10月 28日)

よく使われる頭文字語

  • API: Application Programming Interface
  • CRUD: Create, Read, Update, and Delete
  • CSS: Cascading Style Sheets
  • DOM: Document Object Model
  • JSON: JavaScript Object Notation
  • RDF: Resource Description Framework
  • REST: REpresentational State Transfer
  • RSS: Really Simple Syndication
  • SKU: Stock-keeping unit
  • URI: Uniform Resource Identifier
  • W3C: World Wide Web Consortium
  • XHTML: Extensible HyperText Markup Language
  • XPath: XML Path Language
  • XSL: Extensible Stylesheet Language
  • XSLT: Extensible Stylesheet Language Transformation

この記事では以下の概念について学びます。

  • XPath の使い方
  • 基本的な XPath 式の作成方法
  • PHP の XML ライブラリーの XPath 機能の使い方
  • XPath と PHP を使用してデータ・フォーマットを変換する方法

この記事には、PHP で XPath を使用する実用的な例がいくつか含まれています。「前提条件」に挙げたスキルがあれば、読者はこれらの例を実践することができます。

前提条件

この記事を最大限に活用するためには、XML と PHP5 を理解していると同時に、PHP 拡張機能の構成方法とインストール方法も理解している必要があります。また、PHP5 をサポートする Web サーバーをインストールした UNIX ベースのオペレーティング・システムまたは Microsoft Windows を利用することができ、これらに関する実用的な知識も持っている必要があります。この記事で紹介するサンプル・コードは、これらの OS 上で実践することができます。


XPath の必要性を理解する

Web がセマンティック Web の当初のビジョンに近づくにつれ、アプリケーション同士のやり取りも増えています。SOAP、REST、RSS、RDF などの技術は、将来の Web を実現する強力な要素です。ほとんどの場合、関係するデータを記述するためのメッセージ・フォーマットとしては XML が選ばれます。ある程度までは JSON を使用することもできますが、データ交換の一般的な手段として目にするのはおそらく XML でしょう。

あるいは皆さんは、モバイル・ユーザーやさまざまな Web ブラウザーのために、XML データを XHTML に変換して魅力的で使いやすい対話型のインターフェースを実現する、という課題に直面するかもしれません。

データを XML 文書としてファイルシステムや XML に対応したデータベースに格納することもよく行われます。この場合、データをアーカイブしておいて、後ほど、レポーティング、ユーザー・インターフェースの表示、あるいはアプリケーションとの統合作業といったタスクを行う際に、そのデータを取得します。

XML データを扱う際には、データを構文解析し、最低限の共通要素、つまり目的のデータ (よくアトミックなノード値と呼ばれます) を取得する必要があります。XSLT は W3C の標準であり、XML を変換し、HTML や PDF、さらには異なるスキーマを使用する別の XML 文書にします。XSLT は、XQuery や、XForms、XPointer がそうであるように、XPath を多用します。


XPath の基礎知識

XPath はメモリー内にある XML ツリーをナビゲートするための言語であり、この使い方が XPath を使用する最も単純な形になります。XPath は元々、XSLT と XPointer のための言語として設計されました。XPath 1.0 は 1999年に W3C 標準となりました。それよりも新しい現在の XPath 2.0 は 2007年に仕様として認められるようになりました。

XML のための他の仕様が登場するとともに、XPath が使われることも多くなりました。XPath は現在、XML スキーマ、ISO Schematron、XQuery、XForms の XML をナビゲートするために好んで使われる言語となっています。皮肉なことに (ただし十分な理由があるのですが)、XPath は XML の構文に基づいてはいません。XPath は独自の構文を使用することで、URI や他の XML 関連の構文との衝突を避けています。

PHP で XPath を使用する際には、XPath を単独で使用するわけではないことを必ず頭に置いてください。XPath 以外の XML 仕様の 1 つを扱う際、メモリー内の XML をナビゲートするためのツールとして XPath を使用するのです。

この記事の説明や例の中では、XPath 2.0 よりも広く使われている XPath 1.0 仕様を使います。XPath 2.0 は XPath 1.0 との後方互換性がありますが、現状の PHP では部分的にしか XPath 2.0 をサポートしていません。

XPath 仕様には XPath の標準的な使い方と用語が詳細に説明されています。PHP での XPath の使い方が複雑になりそうな場合、XPath 仕様は信頼できる参考資料となります。そうした複雑な場合を除けば、XPath 仕様は表 1 に示す 4 つの主な領域に分けることができます。

表 1. XPath 仕様の 4 つの主な領域
領域説明
ロケーション・パスロケーション・ステップ、軸、述部、省略構文が含まれています。parent::node, child::text(), attribute::*, /PRODUCTS/PRODUCT[3]/NAME
データ・モデルXML をツリーとして記述します。ルート・ノード、属性、テキスト、名前空間、要素、処理命令、コメントが含まれています。/, /ns1:PRODUCTS/ns1:PRODUCT, @category
式の要素には変数参照、関数、ブール値、数値、ストリング、述部などがあります。/PRODUCTS/PRODUCT/NAME[string-length( ) > 15]/../@category
関数XPath 1.0 には 27 種類の関数が組み込まれており、ノード・セット関数、ストリング関数、ブール関数、数値関数に分類することができます。string-length(), true(), sum()

XPath 式を作成する

PHP コードを作成する前に、少し時間を取って XPath のノードやパス、関数について調べてみましょう。ここではリスト 1 の products.xml ファイルを用いて、よく使われる XPath 式の例として、述部に基づいて XML パス内のデータを検出する場合の式、ノードのアトミックな値を検出する場合の式、関数を利用する場合の式などを紹介します。

リスト 1. 製品群を表現する XML 文書の例 (products.xml)
<?xml version="1.0" encoding="UTF-8"?>
<PRODUCTS>
<PRODUCT category="software">
<SKU>soft32323</SKU>
<SUB_CATEGORY>Business Analysis</SUB_CATEGORY>
<NAME>Widget Reporting</NAME>
<PRICE>4500</PRICE>
</PRODUCT>
<PRODUCT category="software">
<SKU>soft32323</SKU>
<SUB_CATEGORY>Business Analysis</SUB_CATEGORY>
<NAME>Pro Reporting</NAME>
<PRICE>2300</PRICE>
</PRODUCT>
<PRODUCT category="storage">
<SKU>soft32323</SKU>
<SUB_CATEGORY>Tape Systems</SUB_CATEGORY>
<NAME>Tapes Abound</NAME>
<PRICE>2300</PRICE>
</PRODUCT>
<PRODUCT category="storage">
<SKU>soft32323</SKU>
<SUB_CATEGORY>Disk Systems</SUB_CATEGORY>
<NAME>Widget100 Series</NAME>
<PRICE>6500</PRICE>
</PRODUCT>
</PRODUCTS>

/PRODUCTSPRODUCTS ノードのすべての子ノードを返します (子ノードは 4 つあります)。スラッシュ記号 (/) に注意してください。UNIX ベースのオペレーティング・システムを使い慣れている人であれば、スラッシュが絶対パスを表すことを理解していると思います。UNIX ファイル・パスの場合と同様、現在のコンテキストの位置が不明な場合には絶対パスを使用することができます。リスト 1 の文書の場合、PRODUCTS がルート・ノードです。

XPath で相対パスを使用することもできます。式の中で .. を使用すると、階層構造の中で現在のノードよりも 1 つ上のレベルを処理するように式に対して指示することになります (この場合も、UNIX オペレーティング・システムでのディレクトリーの扱いと似ています)。例えば ../PRODUCT/SKU は、各 PRODUCT ノードと関連付けられた 4 つの SKU 番号すべてのアトミックなノード値を返します。

属性ノードを選択するためには XPath の特殊構文が必要です。例えばソフトウェアのカテゴリーに含まれるすべての PRODUCT ノードを返したい場合、まさにそれを行うのが /PRODUCTS/PRODUCT[@category='software'] という式です。この式の category は、この XML 文書内にある属性とみなされます。XPath はアットマーク (@) によって属性を選択することができます。あるいは、attribute:: 構文を使用し、式を /PRODUCTS/PRODUCT[attribute::category='software'] のようにすることで属性を選択することもできます。ほとんどの人はアットマークの方が簡潔で使いやすいと思うようです。

価格が $2,500 を超えるすべての製品の製品名に対するアトミックなノード値 (つまり実際のテキスト値) を選択する場合には、式を /PRODUCTS/PRODUCT[PRICE > 2500]/NAME のように作成します。この式を実行すると、製品名として Widget ReportingWidget100 Series が返されます。

PHP での XPath の使い方に進む前に、最後にもう 1 つの式の例として、/PRODUCTS/PRODUCT/NAME[string-length( ) > 15]/../@category について調べてみましょう。この式を実行すると、softwarestorage という 2 つの値が返されます。具体的には、この式は 15 文字よりも長い製品名のすべての製品のカテゴリー値とマッチします。

リスト 1 の XML 文書は、この記事で説明する XPath 式を評価する対象の文書になります。


PHP での XPath のサポートについて理解する

PHP が XML と XPath をサポートしていることは驚くに当たらないはずです。実際、最もよく使われる Web スクリプト言語には、ほとんどの場合、XPath を扱うための適切な関数がコア・ライブラリーに用意されています。

XML を扱うための選択肢として、PHP のコア・ライブラリーには以下のようなものがあります。

  • SimpleXML
  • DOM
  • XMLWriter/Reader

SimpleXML は使い方が容易であり、XML 関連の比較的単純な作業に適しています。ただし SimpleXML にはいくつかの制約があります。例えば、SimpleXML は妥当性検証、出力、名前空間を完全にはサポートしていません。また、大規模な XML データ・ツリーを処理する場合には、SimpleXML は XML 文書の完全なツリーをメモリーにロードしてから処理を行うことを頭に入れておいてください。

複雑な XPath 式を実行する必要があり、文書を完全に制御したい場合には、DOM は選択肢の 1 つです。DOM は Document Object Model を省略した呼び方であり、W3C の標準です。PHP で DOM を有効にするためには、単純に拡張機能として DOM をインストールします。通常、DOM などの拡張機能をインストールして有効にするのは、たいした作業ではありません。多くの場合、php.ini ファイルの中でコメントアウトされた 1 行をコメントでなくするだけで、既にコンパイルされているモジュールを有効にすることができます。SimpleXML と同様、DOM は XML 文書の完全なツリーをメモリーにロードしてから処理を行います。この記事で後から説明するように、DOMXPath は非常に楽しく使えるツールでもあります。

また、XML_XPath を PHP Extension and Application Repository (PEAR) リポジトリーからダウンロードしてインストールすることもできます。このクラスは DOM を使用しており、文書の操作やアトミックなノード値の抽出に、XPath を使用してクエリーを実行する方法を提供しています。

Zend Framework を使用する場合には、Zend_Dom_Query ライブラリーを使用することができます。皆さんが使用している PHP フレームワークに XML と XPath のための特別なクラスや関数がない場合には、既に PHP に用意されているものを使用することができます。

XMLWriter/Reader は SimpleXML または DOMXPath を使用しない限り XPath を直接サポートすることはできません。そのため、この記事では XMLWriter/Reader についてこれ以上触れないことにします。

どのライブラリーやフレームワークを使用する場合でも、XPath の潜在的な力をフルに活用するためには XPath 式の作成方法を理解していることが不可欠です。PHP の XML 関連ライブラリーによって XPath を使用する場合、XPath の構文は同じです。以下に挙げる例と説明では DOM と SimpleXML を組み合わせて使用しています。


PHP で XPath を扱う

リスト 1 のサンプル・ファイル products.xml と PHP5 の SimpleXML API を使用すると、さまざまな XPath 式を試すことができます。

リスト 2 のコードを実行すると、その結果として完全な XML ファイルの内容が、(もちろん配列の要素として) ダンプされます。XPath 式 /PRODUCTS によって、ルート・ノード (PRODUCTS) の子であるすべてのノードがマッチします。

リスト 2. SimpleXML を使用し、すべてのノードを配列として表示する
<?php
$xml = simplexml_load_file("products.xml");
$products = $xml->xpath("/PRODUCTS");
print_r($products);
 ?>
------------------------------------------------------------
OUTPUT:

Array ( [0] => SimpleXMLElement Object ( [PRODUCT] => 
Array ( [0] => SimpleXMLElement Object
( [@attributes] => Array ( [category] => software ) [SKU] =>
soft1234 [SUB_CATEGORY] => 
Business Analysis [NAME] => Widget Reporting [PRICE] => 4500 ) [1] => 
SimpleXMLElement Object 
( [@attributes] => Array ( [category] => software ) [SKU] => soft5678
[SUB_CATEGORY] =>
Business Analysis [NAME] => Pro Reporting [PRICE] => 2300 ) [2] => 
SimpleXMLElement Object
( [@attributes] => Array ( [category] => storage ) [SKU] => 
stor01010 [SUB_CATEGORY] => Tape Systems [NAME] => 
Tapes Abound [PRICE] => 1900 ) 
[3] => SimpleXMLElement Object ( [@attributes] => 
Array ( [category] => storage ) [SKU] => 
stor23232 [SUB_CATEGORY] => Disk Systems [NAME] => 
Widget100 Series [PRICE] => 6500 ) ) ) )

リスト 3 のコードを実行すると、その結果として XML ツリーの各 NAME ノードの値が配列に出力されます。/PRODUCTS/PRODUCT/NAME という式により、この式とマッチする XML ツリー内のすべてのノードが検出されることに注意してください (最初のノードや最後のノードのみが検出されるわけではありません)。

リスト 3. SimpleXML を使用し、すべての製品名を配列として表示する
<?php
$xml = simplexml_load_file("products.xml");
$products = $xml->xpath("/PRODUCTS/PRODUCT/NAME");
print_r($products);
 ?>
------------------------------------------------------------
OUTPUT:

Array ( [0] => SimpleXMLElement Object ( [0] => Widget Reporting ) 
[1] => SimpleXMLElement Object ( [0] => Pro Reporting ) [2] => 
SimpleXMLElement Object ( [0] => Tapes Abound ) [3] => 
SimpleXMLElement Object ( [0] => Widget100 Series ) )

何らかの基準に基づく特定の (1 つまたは複数の) ノードの値が必要な場合には、リスト 4リスト 5 の式のようにします。

アトミックなノード値を検出するということは、目的の値を XML 文書から抽出するということです。リスト 4 のコードを実行すると、その結果は、ある 1 つのノードのアトミックな値になります。

リスト 4. SimpleXML を使用し、特定の SKU の製品名を表示する
<?php
$xml = simplexml_load_file("products.xml");
$products = $xml->xpath("/PRODUCTS/PRODUCT[SKU='soft5678']/NAME");
print_r($products);
 ?>
------------------------------------------------------------
OUTPUT:

Array ( [0] => SimpleXMLElement Object ( [0] => Pro Reporting ) )

/PRODUCTS/PRODUCT[SKU='soft5678']/NAME という XPath 式により、この式にマッチするすべてのノードが指定されます。この場合、この SKU 番号にマッチする製品は 1 つのみです。XML ツリー内の位置としてのノードの値が必要な場合には、position() 関数を使用することができます。

XPath で条件式を使用すると、より詳細に特定ノードの位置を指定することができます。リスト 5 はその例として、SimpleXML と XPath に条件式を併せて使用する方法を示しています。

リスト 5. ある条件を基に、SimpleXML を使用して製品を検出する
<?php
$xml = simplexml_load_file("products.xml");
$products = $xml->xpath("/PRODUCTS/PRODUCT[@category='software' and PRICE > 2500]"); 
print_r($products);
 ?>
------------------------------------------------------------
OUTPUT:

Array ( [0] => SimpleXMLElement Object ( [@attributes] => 
Array ( [category] => software ) 
[SKU] => soft1234 [SUB_CATEGORY] => Business Analysis [NAME] =>
 Widget Reporting [PRICE] => 4500 ) )

リスト 2345 の PHP コードがまったく同じであり、違いは XPath 式のみであることにお気付きなのではないでしょうか。SimpleXML を使用する手順をマスターすると、XPath 言語の強力さをフルに活用できるようになります。SimpleXML を使用する際に PHP コードで行う手順は以下のようにまとめることができます。

  1. メモリーに XML ファイルをロードする
  2. Object->xpath クラスを使用して XPath 式を作成し、実行する
  3. PHP のスキルを活用し、マッチしたノードと値を操作する

各リストで結果を出力しているのは print_r($products); 文です。この文は値をダンプし、配列として表示します。実際には PHP を使用して結果を取得し、その結果に何らかの操作を行う場合がほとんどのはずです。

リスト 6 は DOM と DOMXPath を使用して XML と XPath を処理しています。

リスト 6. DOMXPath を使用し、特定の SKU に対する製品名を表示する
<?php

$doc = new DOMDocument;
$doc->load('products.xml');
$xpath = new DOMXPath($doc);
$products = $xpath->query("/PRODUCTS/PRODUCT[SKU='soft5678']/NAME");
 
foreach ($products as $product)
{
   print($product->nodeValue);
}
 ?>
------------------------------------------------------------
OUTPUT:

Pro Reporting

SimpleXML を使用する場合のステップと比べ、DOM と DOMXPath を使用する PHP コードのシーケンスはそれほど複雑ではありません。リスト 6 のステップは以下のシーケンスに要約することができます。

  1. DOM オブジェクトからメモリーに XML ファイルをロードする
  2. ロードされた文書から XPath オブジェクトを作成する
  3. XML ツリーにクエリーを実行し、products オブジェクトを返す

この場合も、DOM を使用した PHP コード・スニペットを理解できるようになると、XPath を使用して単調で面倒な処理を行えるようになります。


XPath を使用して変換を行う

実際には、XSLT を使わなくても XML を XHTML に変換することができます。SimpleXML または DOM を使用するだけで、これまでの例を拡張して創造的なことを行い、XHTML ファイルを作成して表示することができます。むしろその方が容易だと思われるかもしれません。しかし、XPath は XSLT 変換のために使われることが多いことや、PHP が XSLT をサポートしていることを考えると、XSLT について説明しておいた方がよいでしょう。また、XSLT を使用することで多くの時間を節約することができ、苛立つことも大幅に減らすことができます。

PHP による XSLT 変換

PHP と XPath に焦点を絞るため、このセクションで説明する変換の例では CSS や有効な URL リンクをまったく使用していません。XSLT を使用してデータを変換する際には、スタイルや JavaScript、その他通常の HTML ページに必要な任意のものを含められることを忘れないでください。また、XSL ファイルはおそらく、使用されるフレームワークに適した方法でアプリケーションの構造の中に注意深く組み込まれるはずです。

XSLT を使用して HTML など他のフォーマットに XML データを変換する際には、XPath を確実に理解していることが不可欠です。

RSS フィードと Atom フィードは XML ベースであるため、フィードをトラバースして目的のデータを選択する上で、XPath は理想的なツールです。PHP と XPath のさまざまな手法に関して、この記事に独自の Atom フィードがあるとすると、PHP の XML ライブラリーの 1 つを使用してフィードからエントリーを抽出し、必要に応じて皆さんの Web サイトに表示することができます。

リスト 7 のような単純な XSLT ファイルは XPath に大きく依存します。

リスト 7. フィードを HTML に変換する単純な XSLT ファイル (article_feed.xsl)
<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
                xmlns:atom="http://www.w3.org/2005/Atom" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                xmlns:dc="http://purl.org/dc/elements/1.1/">

  <xsl:template match="/">

    <html>
      <head><title><xsl:value-of select="//atom:title"/></title></head>
      <table>
        <tr><td><xsl:value-of select="//atom:title"/></td></tr>
        <tr><td><i>"<xsl:value-of select="//atom:subtitle" />",</i></td></tr>
        <tr><td>by <xsl:value-of select="//atom:author"/></td></tr>
        <xsl:for-each select="//atom:feed/entry">
          <table border="1" >
            <tr>
              <td>Title</td><td><xsl:value-of select="//atom:title"/></td>
            </tr>
            <tr>
              <td>Summary</td><td><xsl:value-of select="//atom:summary"/></td>
            </tr>
            <tr>
            </tr>
          </table><br/>
        </xsl:for-each>
      </table>
    </html>
  </xsl:template>
</xsl:stylesheet>

二重のスラッシュ (//) は XPath に対し、ルート・ノードから突き合わせを行い、指定された名前にマッチした最初のノードを検出するように指示しています。title、subtitle、author ノードはそれぞれ 1 つしかないので、これは絶対パスを入力せずにロケーション・パスを表現するための省略形です。for-each ループは //feed/entry ノードのコンテキストで動作するため、title と summary には相対パスが使われています。

リスト 7 の XSLT ファイルを使用すると、この変換を実行するための適切な PHP コードを作成することができます (リスト 8)。

リスト 8. DOM を使用して XSLT 変換を行う
<?php
$doc = new DOMDocument();
$xmlStream = <<<MyFeed
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
<title>Using XPath with PHP</title>
<author><name>Tracy Bost</name></author>
<subtitle type="html">
Let XPath do the hard work for you when working with XML</subtitle>
<link rel="self" type="text/html"
hreflang="en" href="http://www.ibm.com/developerworks/"/>
<updated>15 Aug 2011 22:51:48 +0000</updated>
<entry> 
<title>SimpleXML & XPath </title> 
<summary>If you are using SimpleXML to parse XML or
 RSS feeds, XPath is great to use!</summary> 
<link rel="self" type="text/html" hreflang="en" href=""/> 
<published>21 Apr 2011 04:00:00 +0000</published> 
<updated>21 Apr 2011 04:00:00 +0000</updated> 
</entry> 
<entry> 
<title>DOMXPath</title> 
<summary>If you are using DOM for traversal XML documents, 
give DOMXPath a try! </summary> 
<link rel="self" type="text/html" hreflang="en" href=""/> 
<id>tag:developerWorks.dw,19 Apr 2011 04:00:00 +0000</id> 
<published>12 Aug 2011 04:00:00 +0000</published> 
<updated>12 Aug 2011 04:00:00 +0000</updated> 
</entry> 
<entry> 
<title>XMLReader with XPath</title> 
<summary>For complex XML document reading and writing, 
using XPath with XReader can ease your burden!</summary> 
<link rel="self" type="text/html" hreflang="en" href=""/> 
<id>tag:developerWorks.dw,19 Apr 2011 04:00:00 +0000</id> 
<published>08 Aug 2011 04:00:00 +0000</published> 
<updated>08 Aug 2011 04:00:00 +0000</updated> 
</entry> 
</feed> 
MyFeed;


$doc->loadXML($xmlStream);
$xpath = new DOMXpath($doc);
$xslt = new XSLTProcessor();
$xsl = new DOMDocument();
$xsl->load( 'xsl/article_feed.xsl', LIBXML_NOCDATA);
$xslt->importStylesheet( $XSL );
print $xslt->transformToXML( $doc );
?>

------------------------------------------------------------
OUTPUT: 

<?xml version="1.0"?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Using XPath with PHP</title></head><body><table><tr>
<td>Using XPath with PHP</td></tr><tr>
<td><i>"Let XPath do the hard work for you when working with XML",</i></td>
</tr><tr><td>by Tracy Bost
</td></tr><table border="1"><tr><td>Title</td>
<td>SimpleXML & XPath </td></tr>
<tr><td>Summary</td>
<td>If you are using SimpleXML to parse XML or RSS feeds,
 XPath is great to use!</td>
</tr><tr/></table>
<br/>
<table border="1">
<tr><td>Title</td>
<td>DOMXPath</td>
</tr>
<tr><td>Summary</td>
<td>If you are using DOM for traversal XML documents, 
give DOMXPath a try! </td>
</tr><tr/></table><br/>
<table border="1">
<tr><td>Title</td><td>XMLReader with XPath</td>
</tr>
<tr><td>Summary</td>
<td>For complex XML document reading and writing, 
using XPath with XReader can ease your burden!</td>
</tr><tr/></table><br/>
</table>
</body>
</html>

リスト 8 にはリスト 6 で説明した $xpath->query() 文がないことに注意してください。すべての XPath 式は XSL ファイルの中にあります。単純に DOM を使用してスタイルシートをインポートすると、スタイルシートが変換を実行してくれます。


まとめ

この記事では XPath を紹介し、PHP5 環境で XML を扱う際に XPath をどのように使用するかについて説明しました。PHP に用意された他の多くのライブラリーの場合と同様、XML ライブラリーを使用することで、開発者は下位レベルのクラスやオブジェクトの接続について気にする必要がなくなり、機能要件に集中できるようになります。XPath を使用すれば、XML 内にあるデータの検出や構文解析に関する煩雑な作業をなくすことができます。何が必要かに応じて、オプションとして SimpleXML や、DOM、あるいは Zend Framework などのフレームワークの XML ライブラリーを使用することができます。幸いなことに、それらはすべて、標準的な形で W3C の XPath を扱うことができます。そのため、皆さんが次回 XML ファイルや XML データ・ストリームをロードする際には、処理する必要がある正確な値までナビゲートする上で何も心配する必要がありません。

参考文献

学ぶために

  • XPath 1.0 仕様: XPath の基本的な構文を学んでください。
  • XPath 2.0 仕様: XPath 1.0よりも改善された点について学んでください。
  • PHP 開発者のための XML: 第 1 回 PHP での XML を 15 分で学ぶ」(Cliff Morgan 著、developerWorks、2007年3月): PHP5 での XML の実装を学んでください。この記事は 3 回連載の第 1 回として、まだ PHP での XML の使い方にあまり慣れていない人を対象に、PHP 環境で DOM と SimpleXML を使用して簡単な XML ファイルを読み取り、構文解析し、操作し、作成する方法について説明しています。
  • PHP 開発者のための XML: 第 2 回 高度な XML 構文解析方法」(Cliff Morgan 著、developerWorks、2007年3月): この 3 回連載記事の第 2 回では、PHP5 でのXML の構文解析方法について、またアプリケーションにとって最適の構文解析方法を選択する方法について学ぶことができます。
  • PHP 開発者のための XML: 第 3 回 XML を読み取り、操作し、作成する高度な方法」(Cliff Morgan 著、developerWorks、2007年3月): PHP 開発者向けに XML を解説した 3 回連載記事の最終回となるこの記事では、前回までに紹介した以外の方法で PHP5 でXML を読み取り、操作し、作成する方法について学ぶことができます。
  • XML Manipulation: php.net の Web サイトで XML の操作についての資料を読み、また PHP で XML を使用する方法について学んでください。
  • DOMXPath Manual: php.net の Web サイトで DOMXPath のマニュアルを読み、DOMXPath クラスの使い方について学んでください。
  • 著者の Tracy Bost が developerWorks に寄稿した他の記事 (2011年6月から現在まで): Linux、ハードディスクのレイアウト、共有ライブラリー、その他の技術が解説されています。
  • New to XML: XML を学ぶために必要なリソースを入手することができます。
  • developerWorks の XML ゾーン: DTD、スキーマ、XSLT など、XML の領域でのスキルを磨くためのリソースが豊富に用意されています。XML 技術文書一覧に用意された、さまざまな技術記事やヒント、チュートリアル、技術標準、IBM Redbooks を見てください。
  • IBM XML certification: XML および関連技術において IBM 認定技術者になる方法を参照してください。
  • developerWorks の Technical events and webcasts: これらのセッションで最新情報を入手してください。
  • developerWorks on Twitter: 今すぐ Twitter に参加して developerWorks のツイートをフォローしてください。
  • developerWorks podcasts: ソフトウェア開発者のための興味深いインタビューや議論を聞くことができます。
  • developerWorks On demand demos: 初心者のための製品インストール方法やセットアップのデモから、上級開発者のための高度な機能に至るまで、多様な話題が解説されています。

製品や技術を入手するために

  • PEAR - PHP Extension and Application Repository: このサイトを訪れ、この再利用可能 PHP コンポーネントのためのフレームワークと配布システムについて学んでください。
  • Zend Framework: PHP 開発のためのオープンソースのフレームワークをダウンロードしてください。
  • IBM 製品の評価版: IBM 製品の評価版をダウンロードするか、あるいは IBM SOA Sandbox のオンライン試用版で、DB2、Lotus、Rational、Tivoli、WebSphere などが提供するアプリケーション開発ツールやミドルウェア製品を試してみてください。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=XML, Open source
ArticleID=767346
ArticleTitle=PHP で XPath を使用する
publish-date=06142012