*

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

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

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

記事を読む

no image

Laravelでクラスをnewする

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

記事を読む

no image

システムの仕様書を作れそうなウェブアプリ

現在サービス開発を本気で取り組もうと思っているraruです。 本気が指すところは、事業として成立す

記事を読む

no image

Facebook APIを試してみました

Facebook APIが気になったのでちょっと試してみました。 まず私が勘違いしていたこと

記事を読む

no image

Node.jsのSocket.io入門

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

記事を読む

no image

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

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

記事を読む

no image

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

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

記事を読む

no image

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

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

記事を読む

no image

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

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

記事を読む

no image

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

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

記事を読む

Message

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

PAGE TOP ↑