XMLを配列に・・・これが最適解かも

2007/09/02 | XML

結局「PHP Classes」を探し回った。一時は自分で書いてみようかとも思った。xml_parse_into_structすればキーと値の関係がわかるわけで、これを使えば力技で配列に格納できるからだ。しかし、その苦労をしなくてすんだ。その力技をそのまま記述してくれているスクリプトに出会うことが出来た。

http://www.phpclasses.org/browse/package/2938.html

とりあえず、このスクリプトを、自分好みのコーディングスタイルでキレイに書き換えてみた(中身は同じだけど)。サンプルもファイル内に書いておいた。オリジナルのファイルがGPLだから、これもGPLということで。
暇があったら試してみてください。要コメントということでっ!(^-^)。

class.XmlToArray.lzh

楽天APIを少し・・・(XMLを配列に)

2007/09/01 | XML

久しぶりに楽天のAPIをさわってみた。
どうやら、とうとうコンテンツマッチな広告が出せるようになった模様。コンテンツマッチ広告自体は通常の(google等と同様に)JavaScriptを貼り付けるタイプなのだが、これがAPIとしても提供されている。具体的には、APIからRESTでリクエストを送る際に、マッチさせたいページのURLを引数として渡すというもの(ちょっと目からうろこ)。
ただページ内容との一致具合はイマイチ。どうやらページ内のh1タグ(もしくはタイトル?)のみ重要視しているような感じ。本文にはあまりマッチしていないのだ。もうちょっと改善の余地ありだ。少し期待。

RESTで返される形式はXMLとJSON、希望の形式を選ぶことが出来るが、ここではXMLで受け取ることにした。処理をする場合、まずXMLを配列に落とし込むわけだが、以前紹介したxml_parse_into_struct関数を使うのもいいのだが、今回は別の方法を試した。といっても自分でゴリゴリスクリプトを書くのがいやなので、「PHP Classes」をあさってみた。あっさり希望のクラスを見つけた。

adv_xml2array

DOMXMLが使える環境にないといけないのだが、これすごい簡単!。

$obj=new xml2array($rakutenXML);
$xmlArray=$obj->getResult();

XMLデータを引数に与えてオブジェクトを生成するだけ。後はgetResultメソッドで配列に取り出すだけ。面倒な処理を一切必要とせず、XMLを配列に格納してくれる。ファイル構成もいたってシンプル。ファイルは「class.xml2array.php」を1つだけでいい。逆に配列からXMLを生成する場合は「class.array2xml.php」。

きっとDOMXMLが使えなくても、こんなふうにお手軽にしてくれるクラスがあるはずと思うので、時間が出来たらまた探してみることにする。

Yahooブログ検索のping受信機能の不具合

2007/08/30 | XML

以前、お仕事でお受けした案件で出た問題が解決したのでメモ。
更新ping(weblogUpdates.ping)の送信プログラム作成の依頼をいただいたので、xmlrpc.incを使ってスクリプトを書いてみた。基本的にほぼ全てのpingサーバにおいて、ping送信時のレスポンスを正しく受け取ることができた。しかし日本のyahooだけは「No data received from server.」なぁんていうレスポンスを返してくる。理由がワカラナイ・・・。
納品時は「yahooだけだから」ということで原因探求を免除していただいたのだが、やはり気になる。少し時間をとって調査をしてみた。調査方法としてはfsockopenで最低限の内容で生通信して成功することを確認し、成功結果と失敗結果を比較する方法で調査をおこなった。
結論として、xmlのデータ構成がyahooには気に入らなかったらしい。

本来pingデータはxmlでpostされてくるわけだが、そのxmlを構成している要素は基本2個、拡張2個の合計4個の要素で構成される。もちろん拡張2個はなくても問題ない(基本の2個を押さえていればいいはず)。4つの要素はそれぞれ以下のような感じ。
 ○サイト名
 ○サイトURL
 ○更新のあった(新しく追加された)ページのURL
 ○カテゴリ

yahooが気に入らなかったのは4つの要素が送られてきた点。つまり「拡張2個が余計だ」ということらしい。4つの要素で構成されたxmlを投げた場合はエラーとなり、基本の2つの要素でxmlを構成した場合は、正常なレスポンスが返された。70ほどのpingサーバを試してみたが、「No data …」のエラーは日本のYahooだけ(アメリカYahooでも問題ないのに・・・)。

まぁ、何はともあれすっきりした。
結局最近のpingサーバは、pingを受信した後、rssを収集して回るようになっているので、そもそもpingの拡張要素自体に意味がないのかもしれない。

それにしても・・・Yahoo、こういうのって最低限対応しておくべきではない?。

xmlrpc.incの不具合

2007/08/29 | XML

ブログを操作したり、pingの送受信をしたりする際に使用しているxmlrpc( http://phpxmlrpc.sourceforge.net/)で「不都合」と思われる箇所を発見した。
今までいろいろなブログに対してテストをおこなっていた。MTなどでは正常に送信できているのだが、例えば「gooブログ」で投稿すると???と「?」の羅列になってしまっていた。MTで正しく投稿できているのだから、「gooブログのほうがおかしい」と決め込んでいたのだが、実はxmlrpc.incがまずかった。

xmlrpc.inc読み込み時に以下のように記述する必要があることは前にも書いた。
$GLOBALS[‘xmlrpc_internalencoding’]=’UTF-8′;
しかし、これだけでは「準備が足らない」ということだ。具体的にはxmlrpc.incのxmlrpc_clientクラス中で定義されている「request_charset_encoding」という変数に値をセットしてやらなければならない(デフォルトでは空文字列が与えられている)。具体的には以下のように記述。

require_once(‘xmlrpc.inc’);
$GLOBALS[‘xmlrpc_internalencoding’]=’UTF-8′;
$obj=new xmlrpc_client($path,$host,$port);
$obj->request_charset_encoding=’UTF-8′;

xmlrpc.inc内にはクラスの定義だけでなく、簡単な判別ルーチンや独自で使用する関数も定義されている。上記の文字コード設定は、実際にはクラスの外で定義された関数を仲介してクラス内で処理されている。しかし設定箇所がないので、何もしなければ希望の処理パターンを選べないのだ。

本来なら、値をセットするような関数を用意しておくべきなのだが、それも見当たらない。仕方無しに「直接外部から変数の値を書き換えている」という次第だ。

バグなのか、それともxmlrpcを記述する際の正しい書き方が別に存在するのか、理由は不明。でもこれでほとんどのブログに対して記事投稿ができるようになりそうだ。

simplepie.inc ・・・ すごく仕様かわってたりする

2007/08/27 | XML

RSSをパースするためのライブラリにはいくつかある。有名どころはmagpieとsimplepieだと思う。自分はsimplepieを使っている。
ここ最近横着をして最新版を使っていなかったのだが、今日久しぶりに最新版のsimplepie.incをダウンロードして使ってみた・・・動かない。こともあろうに、ことごとく「Call to undefined method」が出る。なぜ?。

ソースを確認してみたら、実際問題、以前使用していたメソッドがなかった。ということで必要最小限のサンプルを書いてみて動作することを確認した。
困ってしまっている人がいたら以下のサンプルをどうぞ。

$feed=new SimplePie;
$feed->set_cache_location(‘./cache/’);
$feed->set_feed_url($target);
$feed->init();
$feedItems=$feed->get_items();
$entries=array();
foreach($feedItems as $item){
  $entry=array();
  $entry[‘title’]=$item->get_title();
  $entry[‘description’]=$item->get_description();
  $entry[‘date’]=$item->get_date(“U”);
  $entry[‘link’]=$item->get_link();
  $entries[]=$entry;
}


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net