ウェブ|挿入|サイト
授業に戻る
あなたがそんなに多くの力を持っているなら、一体なぜ単一の RDF ソースだけに限定するのでしょうか?前に述べたように、ほとんどの主要サイトは、提供するコンテンツのスナップショットを頻繁に取得します。これらのさまざまなソースをすべてサイトに接続するのは、実際には非常に簡単です。それがどのように行われるかを見てみましょう。
まず、前の例のコードをモジュール化しましょう。こうすることで、単一のソースごとに同じコードを何度も書き直す必要がなくなります。簡略化された方法は、それをクラスにパッケージ化し、このクラスを PHP スクリプトに含めることです。
クラスコードは次のとおりです:
class RDFParser
{
//
// 変数
//
// このクラスのローカル変数を設定します
var $currentTag = "";
var $flag = "";
var $count = 0;
// これはキーを持つチャンネルデータの連想配列です
("title", "link", "description")
var $channel = array();
// これは配列の配列であり、各配列要素
は
// 外側の各配列要素はそれ自体連想配列です
// キー ("title", "link", "description ")
var $items = array();
//
// メソッド
//
// 解析する RDF ファイルの名前を設定します
// これは通常ローカル ファイルです
// PHP ビルドがサポートする場合は、リモート ファイルに設定します
URL fopen()
function setResource($file)
{
$this->file = $file;
}
// setResource で設定された RDF ファイルを解析します()
// $channel 配列と $items 配列に値を設定します
関数 parseResource()
{
// パーサーを作成します
$this->xp = xml_parser_create();
// オブジェクト参照を設定します
xml_set_object($this -> xp, $this);
// ハンドラーとパーサーのオプションを設定します
xml_set_element_handler($this->xp, "elementBegin",
"elementEnd");
xml_set_character_data_handler($this->xp,
" CharacterData") ;
xml_parser_set_option($this->xp,
XML_OPTION_CASE_FOLDING, TRUE);
xml_parser_set_option($this->xp, XML_OPTION_SKIP_WHITE,
TRUE);
// XML ファイルを読み取ります
if (!($fp = fopen( $this->file, "r")))
{
die("$this->file を読み取れませんでした");
}
// データを解析します
while ($xml = fread( $fp, 4096))
{
if (!xml_parse($this->xp, $xml, feof($fp)))
{
die("XML パーサー エラー: " .
xml_error_string(xml_get_error_code($this) -> xp)));
}
}
// パーサーを破棄します
xml_parser_free($this->xp);
}
// タグハンドラーを開始します
function elementBegin($parser, $name, $attributes )
{
$this->currentTag = $name;
//
if ($name == "ITEM")
{
$this-> flag = 1 ;
}
else if ($name == "CHANNEL")
{
$this->flag = 2;
}
}
// 終了タグハンドラー
function elementEnd($parser, $name )
{
$this->currentTag = "";
//
if ($name == "ITEM")
{
$this-> ;count++;
$this->flag = 0;
}
else if ($name == "CHANNEL")
{
$this->flag = 0;
}
}
// 文字データハンドラー
関数characterData ($parser, $data)
{
$data = トリム(htmlspecialchars($data));
if ($this->currentTag == "TITLE" || $this->currentTag ==
"LINK" || $this->currentTag == "DESCRIPTION")
{
// $channels[] または $items[] 配列にデータを追加します
if ($this->flag == 1)
{
$ this->items[$this->count][strto lower($this->currentTag)] .= $data;
}
else if ($this->flag == 2)
{
$this->channel[strto lower($this->currentTag)] .= $data;
}
}
}
// チャンネル情報を含む連想配列を返します
// ($channel[ ] array)
function getChannelInfo()
{
return $this->channel;
}
// item
情報を含む配列の連想配列を返します
// ($items[] 配列)
function getItems( )
{
return $this->items;
}
}
?>
PHP クラスに精通していれば、このコードを理解するのは非常に簡単です。理解できない場合は、記事の最後にあるリンク セクションに直接ジャンプして、クラスの仕組みに関する優れた記事を読んでください。次に、戻って上記のコードを読み続けます。
このクラスを使用する前に、コードの 1 行、特に xml_set_object() 関数を呼び出す上の行を数分かけて説明したいと思います。
ここで問題は、このクラスを使用して複数のコンテンツ ソースを含む Web ページを実際に生成する方法です。
include("class.RDFParser.php");
// 各チャネルに表示する項目の数
$maxItems = 5;
?>
< ;basefont face="Verdana">
// freshmeat.net チャネルを取得して解析します
$f = new RDFParser();
$f->setResource("http://www.freshmeat.net/backend/fm-releases.rdf");
$f->parseResource();
$f_channel = $f- >getChannelInfo();
$f_items = $f->getItems();
// フォーマットして印刷します...
?>
>? echo
$f_channel["title"]; if (is_array($f_items[$x]))
{
// データを出力します
$item = $f_items[$x];
echo "
$item["title"] . "";
}
}
?>
プライマリ ページここのコンテンツ
< ;?
//slashdot.org チャネルを取得して解析します
$s = new RDFParser();
$s->setResource("http://slashdot.org/slashdot.rdf");
$s-> parseResource();
$s_channel = $s->getChannelInfo();
$s_items = $s->getItems();
// フォーマットして印刷します...
?>
< からの最新;a href= echo $s_channel["link"]; ?>$s_channel["title"]; // 項目配列を反復処理します
for ($x=0; $x<$maxItems; $x++) {
if (is_array($s_items[$x]))
{
// データを出力します
$item = $s_items[$x];
echo "
$item["title"] .
;/head>
このコードは非常に単純です。 「new」キーワード
$f = new RDFParser(); を使用してクラスのインスタンスを生成したら、クラス メソッドを使用して、分析する RDF ファイルの場所
$f を設定できます。 ->setResource ("http://www.freshmeat.net/backend/fm-releases.rdf");
$f->parseResource();
そして、後の処理のために $channel 配列と $items 配列を取得します。
$f_channel = $f->getChannelInfo();
$f_items = $f->getItems();
?>
> echo
$f_channel["title"]; // を繰り返します。 items 配列
for ($x=0; $xif (is_array($f_items[$x]))
{
// データを出力します
$item = $f_items[$x];
echo "
$item["title"] . "";
}
}
?>
上記のスクリプトをリロードするたびに、対応する RDF ファイルが特定の場所から取得され、分析後に必要な形式で表示されます。
サイトのトラフィックが多い場合、私たちの努力が無意味だと感じるかもしれません。特に、使用されている RDF データの更新がそれほど速くない場合、状況はさらに悪化します。 この場合、RDF データをローカルにキャッシュすることを検討する方が賢明です。上記のサンプル プログラムを拡張してそれにキャッシュ機能を追加するか、数時間ごとに最新の RDF をダウンロードして、ファイルのローカル コピーを作成します。 Web サーバーに接続し、「ライブ」サーバーではなく、このローカル コピーを使用します。