goo rss 一覧 : これは使えそうな気が。
RSSがだいぶ浸透したわけで、RSSを利用し何かできないかなと思いサイトを巡っていたら、gooのRSS一覧ページを発見。
http://www.goo.ne.jp/rss/
これを利用してなんか面白そうなことできそうな予感。
TOPページ > カテゴリ別表示 : XML
本文開始▼
RSSがだいぶ浸透したわけで、RSSを利用し何かできないかなと思いサイトを巡っていたら、gooのRSS一覧ページを発見。
http://www.goo.ne.jp/rss/
これを利用してなんか面白そうなことできそうな予感。
blogをflash化するということは、必然的にmovabletypeが吐き出すxhtmlファイルをflashに読み込んで処理することになると思うが、問題点が浮上。。。
FlashのDOM(XMLを操作するための仕様)がlevel1までしか対応してないことがあげられる。しかも、level1で最も使えるメソッドであるdocument.getElementsByTagNameが使えない。つまりFlashでノードを操作する際は、childNodesで辿っていく必要がある。
しかし、XHTMLの性質上のちのちソースに手が加わり、構造が大きく変わる可能性があるので、childNodesでノードを辿る方法は汎用性が無いので実用的ではない。
というわけで、自作でgetElementById、getElementsByTagName作ってみようかなと。完成したら配布する予定ですのでよろしくです。
--追記--
Flashとmtを始めから連携させることが前提であれば、エントリーの出力ファイル形式をxmlにすれば結構楽に実現できそうかも。
このサイトすごいね。最初の読込以外、全く読込を感じさせない作りになっている。
http://www.ficc.jp/abm/?search=wd001
少量のデータであれば、最初にテキストデータ(XML)を全て読み込んでしまえばいいんだけど、データ量が1000件にもなるとフリーズしかねない。では一体どう作っているのか?mixiで尋ねてみたところ、どうやら自前でXMLのパースを行いフリーズを回避しているとの意見。
HTML+PHPで同様のことができるかわからないけど、XMLが注目され始めている理由が分かった気がする。
前回の記事に、XMLで簡易データベースを作成と書いたが、新たな問題に直面。PHP等でXMLを読み込むと、XMLを解析しなければならないわけだが、ファイルサイズの上限が思ったより低いっぽい。
以前Flashで簡易掲示板を作った時、csv形式でログの保存をしていたのだが、その時もファイルサイズが1MBぐらいになるとローカル環境でもcsvの解析に相当時間がかかった。
今回はPHPなのでflashよりは快適な処理なのかと思ったら大間違い。サーバー環境にもよるが、数十KB~数百KBが上限らしい。
つまり、いくらコンパクトなインデックスを作成しても、データ件数が1000件にもなれば動作の保証はない。
やはり、商品リストみたいな物を作るのであれば、XMLではなくちゃんとしたデータベースを使うべきなのか。。。掲示板とか登録型リンク集ならXMLを使った方がいい場合もありそうな感じ。
先日、ブログで取り上げた商品リストページですが、PHP+XMLで構築しています。
昇順、降順で表示させるのは全然問題ないのですが、カテゴリ別に表示とかになると、現在のXMLの形式だと厳しいことに気が付いた。。。(ちなみに現在のXMLの構造は各ファイルのインデックスが1階層目、それぞれのファイルが2階層目という具合。インデックスの内容は色んなジャンルがごっちゃになっている。)
そこで考えたのが、現在のインデックスをジャンルごとに分けて、さらにそのインデックスを管理するためのインデックスを作成。つまり、2階層から3階層へ増やすということ。そうすることで、デフォルトでカテゴリが分類されているので無駄なコーディングが減る(はず)。
というわけで作ったばかりの商品リストページですが、早速改良しようかと思います。
自分も最近まで知らなかったんだけど、ルート要素(HTMLでいう「HTML」タグ)はルートノードではないとのこと。
ではルートノードとは何ぞや?という話になるわけで。
どうやらドキュメントオブジェクトというものがルートノードでその子ノードに対応するのがルート要素とのこと。なるほどねぇ~
PHPではDOMでノードの操作ができます(XMLやXHTMLのタグに直接アクセスできる)。
まず、馴染みの深い(あくまでも自分はだけど)Flash(as2.0)でのDOMの指定例。
var myXML = new XML(); //XMLインスタンスを作成
myXML.load("sample.xml"); //XML文書よみこみ
/* onLoadイベント発生後… */
trace(myXML.firstChild.nodeName); //ルート要素ノード名を出力
続いてPHP4での例
$dom = domxml_open_file("sample.xml"); //DOMドキュメントインスタンス生成
$root = $dom->first_child(); //ルート要素ノードを返す
echo $root->node_name(); //ルート要素ノード名を出力
続いてPHP5での例(テスト環境が無いので未チェック)
$dom = new DOMDocument(); //DOMドキュメントインスタンスを生成
$dom->load("sample.xml"); //XML読込
echo $dom->firstChild->nodeName; //ルート要素ノード名を出力
FlashとPHP5は構文がほとんど同じなので、FlashでDOMを習得していれば移行が容易かと。
問題はPHP4。いくつか大きな違いがある。
まず、first_child、node_nameなどネーミングが独自のもの。(規則性はあるので難しくは無い。)
次に、first_child、node_nameなどがDOMの規格ではプロパティであるのに、PHP4ではメソッドとして扱われている。これが厄介。$dom->first_child->node_name;という具合に連続してノードを辿れない。つまり、$node=$dom->first_child();というように変数に代入してやる必要がある。(もしかしたら他にも記述方があるのかも知れないけど。。。)
追記:
$dom = domxml_open_file("sample.xml"); //DOMドキュメントインスタンス生成
$root = $dom->first_child(); //ルート要素ノードを返す
echo $root->node_name(); //ルート要素ノード名を出力
とするよりも
$dom = domxml_open_file("sample.xml"); //DOMドキュメントインスタンス生成
$root = $dom->document_element(); //ルート要素ノードを返す
echo $root->node_name(); //ルート要素ノード名を出力
のほうが確実。
$dom->first_child();だとファイル構成によっては上手くルート要素を取得できないみたい。
FlashでXMLを処理する時、空白ノードを取り除く場合「XML.ignoreWhite」を使用するが、PHPでそれに対応するものを発見。どうやらPHP4とPHP5では指定方法が違うようだ。(そもそもPHP4のDOMは標準規格ではない)
PHP4では
domxml_open_file("test.xml",DOMXML_LOAD_DONT_KEEP_BLANKS)
とこのようにdomxml_open_file関数に「DOMXML_LOAD_DONT_KEEP_BLANKS」オプションを指定し、
PHP5では
$DOMObject->preserveWhiteSpace = FALSE;
とすることで空白ノードを削除できる。
Flashユーザーからすると、PHP5のほうが馴染みやすいなぁ。PHP5に移行したいけど、こればっかりはサーバーの問題だしな。。。
以前からFlashとの連動でPHPをちょくちょくいじっていたんだけど、HTMLでPHPを利用するのは実は初めてだったり。
動作チェックという意味合いも込めてechoで文字列を書き出すテストをしてみると早速エラーが。。。構文は合っているのに何故?よくみると1行目に問題があるらしい。
<?xml version="1.0" encoding="utf-8"?>
どうやらこのXML宣言が悪さをしている模様。調べてみると、「<? ~ ?>」はPHPのショートカットにも使われているらしいので、XMLと混同してしまう模様。
XML宣言をPHPのechoで書き出すことで解決可能です。
本文終了▲