PHP での XML アプリケーション (2)

WBOY
リリース: 2016-06-21 09:13:54
オリジナル
1023 人が閲覧しました

xml

ドキュメントを解析するにはどうすればよいですか?
すべての準備作業が完了したら、スクリプトは最終的に XML ドキュメントを解析できます: カスタム関数

Xml_parse_from_file() は、パラメータで指定されたファイルを開き、4kb サイズで解析を実行します。
xml_parse() は、xml_parse_from_file() と同様、エラーが発生した場合、つまり XML ドキュメントの形式が不完全な場合に false を返します。

xml_get_error_code() 関数を使用して、最後のエラーの数値コードを取得できます。この数値コードを xml_error_string() 関数に渡して、エラー テキスト情報を取得します。 XML の現在の行番号を出力し、デバッグを容易にします。

文書を解析するときに、Expat にとって強調する必要がある問題は、文書構造の基本的な記述をどのように維持するかということです。

前に述べたように、イベントベースのパーサー自体は構造情報を生成しません。ただし、タグ構造は XML の重要な機能です。たとえば、要素シーケンス は、<figure><title> とは異なる意味を持ちます。本のタイトルと写真のタイトルは、どちらも「タイトル」という用語を使用していますが、関連性はありません。したがって、イベントベースのパーサーを使用して XML をより効率的に処理するには、独自のスタックまたはリストを使用してドキュメントの構造情報を維持する必要があります。 <br><br> ドキュメント構造のミラーを作成するには、スクリプトは少なくとも現在の要素の親要素を知っている必要があります。これは、Exapt の API では不可能であり、コンテキスト情報なしで現在の要素のイベントのみを報告します。したがって、独自のスタック構造を構築する必要があります。 <br><br> スクリプト例では先入れ後出し (FILO) スタック構造を使用しています。配列を通じて、スタックはすべての開始要素を保存します。開始要素処理関数の場合、現在の要素は array_push() 関数によってスタックの先頭にプッシュされます。同様に、終了要素処理関数は、array_pop() を通じて先頭要素を削除します。 <br><br> シーケンス <book><title> の場合、スタックは次のように埋められます:

開始要素 book: スタックの最初の要素に「book」を割り当てます($ スタック[0])。
開始要素 title: スタックの先頭 ($stack[1]) に「title」を割り当てます。
要素タイトルの終了: スタック ($stack[1]) から最上位の要素を削除します。
要素タイトルの終了: スタック ($stack[0]) から先頭の要素を削除します。

PHP3.0 は、$ Depth 変数を通じて要素のネストを手動で制御することによってこの例を実装するため、スクリプトがより複雑に見えます。 PHP4.0 では、array_pop() 関数と array_push() 関数を使用して、スクリプトをより簡潔にします。

XML ドキュメント内の要素情報を収集するにはどうすればよいですか?

各要素の情報を収集するには、スクリプトは各要素のイベントを記憶する必要があります。グローバル配列変数 $elements を使用して、ドキュメント内のさまざまな要素をすべて保存します。配列の項目は要素クラスのインスタンスであり、4 つの属性 (クラス変数) を持ちます

$count - 要素がドキュメント内で見つかった回数
$chars - 文字イベントのバイト数要素内
 $parents - 親要素
$childs - 子要素

注: PHP の特徴は、while(list() = each()) ループを通じてクラス構造全体をトラバースできることです。対応する配列全体を走査するのと同じです。すべてのクラス変数 (および PHP3.0 を使用する場合はメソッド名) は文字列として出力されます。

要素が見つかったら、その要素がドキュメント内で何回出現したかを追跡するために、対応するカウンターをインクリメントする必要があります。対応する $elements 項目の count 要素も 1 つ増加します。

また、現在の要素がその子要素であることを親要素に知らせる必要があります。したがって、現在の要素の名前は、親要素の $childs 配列内の項目に追加されます。最後に、現在の要素はその親が誰であるかを記憶する必要があります。したがって、親要素は、現在の要素の $parents 配列内の項目に追加されます。

統計情報の表示
残りのコードは、$elements 配列とそのサブ配列をループして、統計結果を表示します。これは最も単純なネストされたループですが、正しい結果が出力されますが、コードは簡潔でも特別なスキルもありません。これは、作業を完了するために毎日使用できる単なるループです。

スクリプトの例は、PHP の CGI モードでコマンドラインから呼び出されるように設計されています。そのため、統計結果の出力形式はテキスト形式となります。スクリプトをインターネット上で使用する場合は、出力関数を変更して HTML 形式を生成する必要があります。

PHP&XML を使用してミニ検索エンジン インスタンスをコンパイルするにはどうすればよいですか?
まず、プログラムで使用される XML (xyz.xml として保存) について理解しましょう。


PHP および XML テクノロジーで構築された検索エンジン
name1< web>
コンピュータネットワーク
name2

プログラミング
PHP
www.phpbuilder.com url="http://www.fokus.gmd.de" memo="[英語]PHP マニュアル
/sub>


その構造は非常に単純で、sub は属性を含む Web サイトの情報、URL は Web サイトの接続を表します。メモは備考情報、? ? 、<サブ>? ? に含まれるデータは、上記の規定に準拠したカテゴリおよび Web サイトの名前です。

それでは、上記で提起された質問に答えてみましょう: なぜ XML を使用して検索エンジンをコンパイルするのでしょうか?
第一の理由は、さまざまな理由によりデータベース (MySQL またはその他) を使用できない場合があることです。
第二に、データ量が少ない検索エンジンの場合、そのデータ量は非常に少ないです。データベースの使用はあまり効率的ではない可能性があります。最も重要な点は、この検索エンジンは保守が非常に簡単であり、面倒なデータベース保守プログラムを作成する必要がないことです。たとえば、カテゴリまたは Web ページを追加したい場合は、テキスト ファイルを編集して、Fuwaneb>??? または ??? を追加するだけです。さらに、カテゴリを別の場所に移動したい場合は、サブのこの部分をコピーするだけで済みます。

次に、PHP を使用して XML を表示する最も簡単な例を示します。

次のプログラムは XML を解析し、ツリー構造に従ってブラウザに出力し、各層の要素の総数を表示します。

$file = "demo.xml";//XML ファイル
function xml_parse_from_file($parser, $file) {//XML ファイルを解析する関数}
function start_element($parser, $name, $ attrs) {// などのオープン要素マークが見つかった場合は、このセクションを実行してください}
function stop_element($parser, $name) {//< などのオープン要素マークが見つかった場合/body> この段落を実行するだけ}
function data($parser, $data) {……}
function showcount(){ //各レベルの要素の総数を表示}

global $level,$levelcount,$ maxlevel;
$level = -1;
$parser = xml_parser_create(); // パーサーインスタンスを生成
xml_set_element_handler($parser, "start_element", "stop_element") // ハンドラー関数を設定
xml_set_character_data_handler($parser, "data ");
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
$ret = xml_parse_from_file($parser, $file); // ファイルを解析します
if(!$ret) {
die(sprintf("XML エラー: %s行 % d", xml_error_string(xml_get_error_code($parser)), xml_get_current_line_number($parser)));
}
xml_parser_free($parser); // パーサーを解放します
showcount();
?>

上記のプログラムに基づいて、レイヤー番号とレイヤー内のその番号に従ってサブツリーを表示できます。例:

links (0, 1)
+- ---ウェブ (1,1)
+---サブ (1,2)
| +---ウェブ (2,1)
 | ---サブ (2,2)
| +---ウェブ (3,1)
 | :
:
:
次のコードは、検索エンジンの基礎です。サブカテゴリ (プログラミング->PHP-> など) の情報を表示するには、それを使用する必要があるためです。


function start_element($parser, $name, $attrs) {
global $level,$levelcount,$maxlevel,$hide,$lev,$num,$PHP_SELF;
$level + = 1;
if($level>$maxlevel)
$maxlevel=$level;

if($hide){ // サブツリーの範囲内かどうかを判断します。 $ hide==FALSE は
if($level==$lev&&$levelcount[$level]==$num) にあります
}else{
if($level<=$lev)$hide= TRUE ;
}

if(!$hide){
……//output
}
}
関数 data($parser, $data) {
global $level,$hide;
if(trim($data)!=""){ エコー トリム($data) }
}
}
......
グローバル $hide,$lev,$num,$PHP_SELF; = -1;
$hide = TRUE;
echo "

Root

"; lev=0;$ num=1;
}
....
?>

mini の検索エンジンはどのように機能しますか?

 いくつかの準備ができたので、検索エンジンの主要なファイルを見てみましょう。

最初の段落は、Sina と Yahoo のカテゴリ別のクエリを模倣するものです。
 2 番目の段落は、一致するコンテンツを表示するための検索クエリ部分です (ツリー全体を走査します)。

xml3.php

キーワードマッチングはeregi関数を使用します。入力されたテキストはエラーにならないことを前提としています。

<全文終了>



関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート