ウェブ|挿入|サイト
RSS は技術的にはよく構造化された XML ドキュメントであるため、標準の XML プログラミング技術を使用して処理できます。主要なテクノロジには、SAX (Simple API for XML) と DOM (Document Object Model) の 2 つがあります。
SAX パーサーは、XML ドキュメント全体を走査し、さまざまなタイプのタグに遭遇したときに特定の関数を呼び出すことによって機能します。たとえば、特定の関数を呼び出して開始タグを処理し、別の関数を呼び出して終了タグを処理し、その後、その間のデータを処理する関数を呼び出します。パーサーの役割は、単にドキュメントを順番に走査することです。呼び出される関数は、検出されたタグの処理を担当します。トークンが処理されると、アナライザーはドキュメント内の次の要素に進み、プロセスが繰り返されます。
一方、DOM パーサーの仕事は、XML ドキュメント全体をメモリに読み取り、それを階層ツリー構造に変換することです。また、さまざまなツリー ノード (およびノードにアタッチされたコンテンツ) にアクセスするための API も提供します。再帰的処理方法と API 関数により、開発者はさまざまなタイプのノード (要素、属性、文字データ、コメントなど) を区別できるようになり、同時にノードのタイプとノードの深さに基づいてさまざまなアクションを実行できるようになります。ドキュメントツリー。
SAX および DOM パーサーは、あなたと私のお気に入りである PHP を含む、ほぼすべての言語をサポートします。この記事では、PHP の SAX パーサーを使用して RDF を処理する例を紹介します。 もちろん、DOM パーサーを使用するのも同様に簡単です。
この簡単な例を見て、覚えておいてください。これは、http://www.freshmeat.net/ から直接取得した、使用する RDF ファイルです。 rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://purl.org/rss/1.0/"
xmlns :dc="http://purl.org/dc/elements/1.1/"
>
<チャンネル rdf:about="http://freshmeat.net/">
freshmeat .net< ;/title>
http://freshmeat.net/
freshmeat.net は、Unix
およびクロスプラットフォームのオープン ソース ソフトウェアの Web 最大のインデックスを管理しています。
freshmeat.net データベースに細心の注意を払ってカタログ化されており、新しい
コードへのリンクが毎日追加されます。
en-us
/dc:subject>
freshmeat.net
freshmeat.net 寄稿者
Copyright (c ) 1997 -2002 OSDN
2002-02-11T10:20+00:00
< li rdf:resource="http://freshmeat.net/releases/69583/" />
.net/img/fmII-button.gif">
freshmeat.net
http://freshmeat.net/img/fmII-button.gif http://freshmeat.net/
- sloop.splitter 0.2.1
http://freshmeat.net/releases/69583/
リアルタイム効果音プログラム。< ;/説明>
2002-02-11T04:52-06:00
apacompile 1.9.9
http://freshmeat.net/releases/69581/
完全-注目の Apache コンパイル HOWTO。
2002-02-11T04:52-06:00
releases.rdf";
// パーサーで使用する変数をいくつか設定します
$currentTag = "";
$flag = "";
// パーサーを作成します
$xp = xml_parser_create();
// 要素ハンドラーを設定します
xml_set_element_handler($ xp, "elementBegin", "elementEnd");
xml_set_character_data_handler($xp, "characterData");
xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING, TRUE);
// XML ファイルを読み取ります
if (!($fp = fopen( $file, "r")))
{
die("$file を読み取れませんでした");
}
// データを解析します
while ($xml = fread($fp, 4096))
{
if ( !xml_parse($xp, $xml, feof($fp)))
{
die("XML パーサー エラー: " .
xml_error_string(xml_get_error_code($xp)));
}
}
// パーサーを破棄します
xml_parser_free($xp);
// タグ ハンドラーを開始します
function elementBegin($parser, $name, $attributes)
{
global $currentTag, $flag;
// 現在のタグの名前をグローバル スコープにエクスポートします
$currentTag = $name;
// 項目ブロック内の場合、フラグを設定します
if ($name == "ITEM")
{
$flag = 1;
}
}
// 終了タグ ハンドラー
function elementEnd($parser, $name)
{
global $currentTag, $flag;
$currentTag = "";
// 項目ブロックを終了する場合、行を出力し、フラグをリセットします
if ($name == " ITEM")
{
echo "
";
$flag = 0;
}
}
// 文字データ ハンドラー
function CharacterData($parser, $data)
{
global $currentTag, $flag ;
// 項目ブロック内の場合、項目データを出力します
if (($currentTag == "TITLE" || $currentTag == "リンク" ||
$currentTag ==
"説明") && $flag == 1)
{
echo "$currentTag: $data
";
}
}
?> ;
不明な白を見ますか? -releases.rdf";
// パーサーで使用する変数をいくつか設定します
$currentTag = "";
$flag = "";
$currentTag变量保存は分析器の現在処理される要素の名前——私たちの最終的な目的は、チャンネル内の個々の項目(項目)を表示することであり、また、チェーンが付いていることを知る必要があるためです。さらに、私が使用しているのは SAX アナライザであり、逐次的に動作しており、API が提供できるアナライザはありません。したがって、私たちはこの問題を解決するための仕組みを自分で発明することができませんでした。これが、$flag 値がアナライザーに含まれているかどうかを判断するために使用されます。 区分けも - 区分けの場所にあります。
次に行われるのは、SAX アナライザーの初期化と、RSS 文の分析の開始です。
// 要素ハンドラーを設定します
xml_set_element_handler($xp, "elementBegin", "elementEnd");
xml_set_character_data_handler($xp, "characterData");
xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING, TRUE);
// XML ファイルを読み取ります
if (!($fp = fopen($file, "r")))
{
die("$file を読み取れませんでした");
}
// データを解析します
while ($xml = fread($ fp、4096))
{
if (!xml_parse($xp, $xml, feof($fp)))
{
die("XML パーサー エラー: " .
xml_error_string(xml_get_error_code($xp)));
}
}
// destroy parser
xml_parser_free($xp);
この段階のコードは明らかに、その中の注釈は十分に解読されています。给次に、xml_parse() 関数は、開始マークと停止マーク、およびその両方の間の文字データを処理します。
// 開始タグ ハンドラー
function elementBegin($parser, $name, $attributes)
{
global $currentTag, $ flag;
// 現在のタグの名前をグローバル スコープにエクスポートします
$currentTag = $name;
// 項目ブロック内の場合、フラグを設定します
if ($name == "ITEM")
{
$ flag = 1;
}
}
この関数は、現在認識されている名前とプロパティをパラメータとして使用します。名前は、全体の変数 $currentTag で評価されます。 g量置1。同様に、終了タグが見つかった場合は、終了タグ ハンドラー elementEnd() が呼び出されます。
// 終了タグハンドラー
function elementEnd($parser, $name)
{
global $currentTag, $flag;
$currentTag = "";
// 項目ブロックを終了する場合は、行を出力し、フラグをリセットします
if ($name == "ITEM")
{
echo "
";
$flag = 0;
}
}
クローズドタグ処理関数は、パラメータとしてタグ名も受け取ります。 の終了タグが見つかった場合、変数 $flag の値は 0 にリセットされ、変数 $currentTag の値はクリアされます。
それでは、タグ間の文字データはどのように扱うのでしょうか? これが私たちの興味です。まず、文字データ プロセッサであるcharacterData() に挨拶します。
// 文字データハンドラー
function CharacterData($parser, $data)
{
global $currentTag, $flag;
// 項目ブロック内の場合、項目データを出力します
if (($currentTag == "TITLE" || $currentTag == "リンク" ||
$currentTag ==
"説明") && $flag == 1)
{
echo "$currentTag: $data
";
}
}
ここで、この関数に渡されたパラメーターを見ると、アナライザーが現在どのタグを処理しているかは分からず、開始タグと終了タグの間のデータのみを受信することがわかります。これが、最初にグローバル変数 $currentTag を導入した理由です。
$flag 変数の値が 1 の場合、つまり、アナライザーが現在 - ブロックの間にある場合、現在処理中の要素が 、< ;link> または を使用すると、データが出力デバイス (この場合、出力デバイスは Web ブラウザー) に出力され、各要素の出力の後に改行文字
が追加されます。
RDF ドキュメント全体がこのように順次処理され、- タグが見つかるたびに特定の出力が表示されます。以下で実行結果をご覧ください: