ホームページ  >  記事  >  php教程  >  PHP を使用して RDF コンテンツを Web サイトに挿入する方法 (4)

PHP を使用して RDF コンテンツを Web サイトに挿入する方法 (4)

WBOY
WBOYオリジナル
2016-06-21 09:13:571435ブラウズ

ウェブ|挿入|サイト

授業に戻る

あなたがそんなに多くの力を持っているなら、一体なぜ単一の 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=$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();
    ?>

    >$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 サーバーに接続し、「ライブ」サーバーではなく、このローカル コピーを使用します。




    声明:
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。