*

PHPでXMLをnamespaceを利用したxpathでnode取得

公開日: : 投稿者:raru php, web技術

PHPでxmlを読み込んでxpathでnodeを取得して見たいと思います。
今回はyahooの形態素解析apiから取得したxmlを題材にしてみます。

XMLオブジェクトの操作

順を追ってxmlを操作してみます。
ちなみにyahooの形態素解析は前回のcurlを利用して取得できます。

$data = array(
        'appid' => self::APP_ID,
        'results' => 'ma',
        'sentence' => trim($name)
    );

$response = $this->getGetRequestResponse($data);

いろいろと端折っていますが、とりあえずこれでxmlの文字列が取得できます。

SimpleXMLObjectの生成

先ほど取得した、xml文字列からPHPにあるSimpleXMLObjectを生成してみます。

$xml = simplexml_load_string($xmlString);

これは文字列を引数にxmlのオブジェクトを生成しているわけですね。
これでオブジェクトができました。

namespaceを設定する

yahooのapiを利用して取得したxmlにはnamespaceが設定されていますので、そのままxpathを解析させてもちゃんとデータが取得できません。
そのため、ここで設定してみます。

$xml->registerXPathNamespace('y', 'urn:yahoo:jp:jlp');

第一引数は、そのnamespaceに対するエイリアスみたいなものでしょうか。この名前を利用してxpathを実行します。
第二引数では、xml内で宣言されている名前の付いていないxmlnsを指定しています。
これでnamespaceを利用しつつちゃんとxpathでデータが取得できるようになります。

C#であればnamespaceなどを全部無視してxpathを実行したりできるのですがphpにもあるのでしょうか?

xpathの実行

ではxpathを指定しつつ、取得したデータを利用してみます。

$words = $xml->xpath('//y:ResultSet/y:ma_result/y:word_list/y:word');
$data = array();

foreach($words as $word){
    array_push($data, (string)$word->surface, (string)$word->reading);
}
return $data;

xpathを実行する際に、先ほど設定したnamespaceを指定しつつ実行します。
そしてここでは複数取得されてくるためforeachで回して、中身を配列に突っ込んでいます。

$word->surfaceなどのままでと、以下のようなものも文字列ではなくSimpleXMLObjectで取れてくるため、stringでキャストする事でnode内の文字として取得しています。

<word>
  <surface>佐藤</surface>
  <reading>さとう</reading>
</word>

これでCURLとXMLのパースができるようになったのでapiを利用するのに必要な情報は概ね揃いましたね。

関連記事

no image

Javascript パターン

最近更新を行なえるほど技術を追っていませんが、日々の電車での移動時間に本を読んでいます。 2駅乗っ

記事を読む

no image

WebRTC + Node によるルーム機能付きビデオチャット 2

前回の続き こちらは前回の記事の続きになります。 また前回の記事にコメントを頂いたのですが、

記事を読む

no image

Node.jsのSocket.io入門

前置き WebRTCを使用して通信を行なうときに、offerなどの情報を伝える為にサーバサイドのプ

記事を読む

no image

socket.ioとwebRTCでビデオチャット

現在作成したいものがあるために、その予行演習として nodeのsocket.ioとwebRTC機能

記事を読む

no image

Mac OS X (Yosemite) にLaravelをインストール

Max OS 10.10(yosemite)にPHPフレームワークのLaravelをインストールして

記事を読む

no image

Laravelでクラスをnewする

今回はLaravelでのクラスのnewの仕方です。 正確には、Laravelでの他ファイルで作成し

記事を読む

no image

Laravelでルーティングからview表示をしてみる

Laravelでのroutes.phpの設定と、bladeを利用してview表示を行います。 いろ

記事を読む

no image

PHPのcURLを利用してAPIをGET/POSTで叩く

PHPからcURLを利用してhttpのget, postで問い合わせを行ってみます。 今回はYAH

記事を読む

no image

Facebookから日本語でデータ取得 (※だたしlocationは除く

Facebook Graph APIを通して取得したデータがローマ字や英語で困ることがあります。

記事を読む

no image

MAMPでLaravelを動作させる

先日laravelをMAMPのhtdocsに配置しましたが、当然それでは動かなかったので設定しました

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

PAGE TOP ↑