*

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

Laravelでクラスをnewする

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

記事を読む

no image

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

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

記事を読む

no image

Node.jsのSocket.io入門

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

記事を読む

no image

MAMPでLaravelを動作させる

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

記事を読む

no image

IEとchromeでbeforeunloadをaタグのhrefに反応させずに利用……できなかった

今回beforeunloadが面倒な動きをしていたので調査&ある程度都合よくしてみました。 してみ

記事を読む

no image

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

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

記事を読む

no image

Laravelでbladeを利用したViewを作成

今回はLaravelで採用されているviewテンプレートのBladeを利用して画面を作成してみます。

記事を読む

no image

Facebook APIを試してみました

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

記事を読む

no image

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

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

記事を読む

Message

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

PAGE TOP ↑