PHP は XML を処理します

WBOY
WBOYオリジナル
2016-06-23 14:34:141203ブラウズ

【IT168 特別記事】シンプル、とてもシンプル

ここ数年、洞窟に隠れていた人でない限り、XML について聞いたことがあるはずです (XML は、ますます多くの Web パブリッシャーがコンテンツの作成に注目しているツールです)マークアップボックス)。ユーザー定義のタグを含む XML ドキュメントやタグが実際に動作しているのを見たことがあるかもしれません。複雑なコードの混乱を一体どうやって人が判読可能なコンテンツに変換できるのか疑問に思ったことがあるかもしれません。

答えは、簡単ではありません。

PHP には、バージョン 4.0 以降、XML を解析する (意味を理解する) 2 つの標準的な方法 (SAX と DOM) のサポートが含まれていますが、これらの方法の複雑さと固有の奇妙さにより、最も熱心な XML 開発者以外のすべての開発者が諦めることができないことがよくあります。 。ただし、PHP 5.0 では、このすべてが変更され、SimpleXML と呼ばれる新しい XML 拡張機能が導入され、XML ドキュメントを操作する際の苦痛がすべて (つまり、すべて) 取り除かれます。その方法については、読み続けてください。

昔の悪い時代

SimpleXML がなぜ非常に優れているのかを理解するために、簡単な歴史のレッスンをしてみましょう。

SimpleXML が登場する前は、XML ドキュメントを処理する方法が 2 つありました。 1 つ目は、SAX または XML 用の単純な API です。これには、XML ドキュメントを走査し、パーサーがさまざまなタイプのタグを検出したときに特定の関数を呼び出すことが含まれます。たとえば、開始タグを処理するために 1 つの関数を呼び出し、終了タグを処理するために別の関数を呼び出し、その間のデータを処理するために 3 番目の関数を呼び出したとします。 2 番目のアプローチは DOM (ドキュメント オブジェクト モデル) です。これには、XML ドキュメントを表すツリーをメモリ内に作成し、ツリー トラバーサル メソッドを使用してそれを操作します。ツリーの特定のノードに到達すると、対応するコンテンツを取得して使用できます。

どちらのアプローチも、特にユーザーフレンドリーではありません。SAX では、開発者が XML ファイル内で検出される要素のタイプごとにイベント ハンドラーをカスタマイズする必要がありますが、DOM アプローチでは、メモリを大量に消費するオブジェクト指向パターンが使用されるため、大規模な XML ドキュメントの場合は非効率的ですが、開発者の労力は必要ない傾向があります。より大きな文脈では、PHP 4 はさまざまな XML 拡張機能に対して多数の異なるサポート ライブラリを使用しているため、さまざまな XML 拡張機能の動作方法に不一致が生じ、相互運用性に関する懸念が生じます (開発者に対する懸念には多くの混乱が伴います)。

PHP 5.0 では、この問題は、すべての XML 拡張機能の標準ライブラリとして libxml2 ライブラリ (http://www.xmlsoft.org/) を採用し、さまざまな XML 拡張機能の操作の一貫性を高めるための調整された取り組みによって修正されました。 PHP 5 での XML への最大の変更は、Sterling Hughes、Rob Richards、Marcus Börger によって開発された SimpleXML 拡張機能ですが、この拡張機能は、PHP 5 での XML ドキュメントの解析を、PHP 4 での XML ドキュメントの解析よりもユーザーフレンドリーにすることを目的としています。

SimpleXML は、XML ドキュメントをオブジェクトに変換し、ドキュメント内の要素を標準のオブジェクト表記を使用してアクセスできるオブジェクト プロパティに変換することによって機能します。これにより、XML 階層内の任意のレベルの要素に簡単にアクセスして、そのコンテンツにアクセスできるようになります。ドキュメント ツリーの同じレベルにある繰り返し要素は配列として表されますが、要素のカスタマイズ可能なコレクションは XPath (詳細は後述) の位置パスを使用して作成でき、これらのコレクションは PHP の標準ループ構造を使用して処理できます。要素のプロパティへのアクセスは、連想配列のキーにアクセスするのと同じくらい簡単です (新しく学習することや特別なコードを記述する必要はありません)。

SimpleXML と PHP を一緒に使用するには、PHP ビルドに SimpleXML のサポートが含まれている必要があります。このサポートは、PHP 5 の UNIX および Windows バージョンではデフォルトで有効になっています。詳細については、http://www.php.net/manual/en/ref.simplexml.php を参照してください。 PHP 4 ユーザーの場合は運が悪いです。SimpleXML は PHP 5 でのみ使用できます。

Children's Zoo

SimpleXML の仕組みを理解するには、次の XML ファイルを考えてください。年齢 > 年齢 > 種 > 母親 >父親 >/ 両親 >

ここで、 に含まれる名前を取得する方法が必要です。要素の間。 SimpleXML を使用するととても簡単です:

parents -> mother . " および " . $xml ->parents -> Father . " n " ; ?>

アクションは simplexml_load_file( ) 関数 最初に、この関数は解析する XML ファイルのパスと名前を受け取ります。ファイル解析の結果は、ルート要素以下の要素に対応するプロパティを持つ PHP オブジェクトです。したがって、要素内の文字データには、標準のオブジェクト->プロパティ表記を使用して、最初にルート要素から開始してファイルの階層パスを下ってアクセスできます。

オペレーションを読み取ることができるのと同じように、オペレーションを書くこともできます。 SimpleXML を使用すると、特定の XML 要素の内容を簡単に変更できます (対応するオブジェクト プロパティに新しい値を割り当てるだけです)。以下に例を示します:

年齢 = 4 ; $xml -> " Sue Snail " ; $xml ->parents -> Sid Snail " // ファイルに新しいデータを書き込みます ($file, $xml -> asXML());まず XML ファイルが読み取られ、その後、対応するオブジェクト属性に新しい値が割り当てられて、各要素内の文字データが変更されます。通常、XML ツリーを標準出力デバイスに出力するために使用される asXML() メソッドを、この例では file_put_contents() 関数と組み合わせて、元の XML ドキュメントを新しいデータで上書きします。


シンシティ

XML 階層内の同じレベルにある繰り返し要素は配列要素で表され、数値インデックスを使用してアクセスできます。これがどのように機能するかを確認するには、次の XML ファイルを考えてみましょう。 ;/ 罪 > 罪 > 罪 > sin > XML ファイル $file = " sinners.xml " ; // ファイルをロード $xml = simplexml_load_file($file) または die ( " XML ファイルをロードできません! " ) // 各 にアクセスします> sin[ 0 ] ; echo $xml -> sin[ 2 ] ; ] ; エコー $xml -> sin[ 4 ] ; エコー $xml -> ; ? >
次の同等のリストのように、foreach() ループを使用してコレクションに繰り返しアクセスすることもできます。 php // XML ファイルの名前を設定 $file = " sin. xml " ; // ファイルをロード $xml = simplexml_load_file($file) or die ( " XML ファイルをロードできません! " ); // 要素コレクションを反復処理します ($xml -> sin as $sin) { echo " $sinn " ; } ?>

将来はどうなるか


SimpleXML は、要素と同様に要素の属性とその内容を透過的に操作できます。プロパティと値のペアは PHP 連想配列のメンバーとして表現され、通常の配列要素と同様にアクセスできます。これがどのように機能するかを理解するには、以下のスクリプトを見てください:

形状の種類 = " 長方形 " 長さ = " 2 " /> 形状の種類 = " 7 " // load string $xml = simplexml_load_string($str) or die ( " XML 文字列をロードできません! " ); // 形状ごとに // 面積を計算します ($xml ->shape as $shape) { if ($shape[ ' タイプ ' ] == " 円 " ) { $area = pi() * $shape[ ' 半径 ' ] * $shape[ ' 半径 ' ] } elseif ($shape[ ' タイプ ' ] == " 長方形 " ); { $area = $shape[ ' length ' ] * $shape[ ' width ' ]; } elseif ($shape[ ' type ' ] == " square " ) { $area = $shape[ ' length ' ] * $shape [ ' length ' ]; } echo $area. " n " ; >

外部 XML ファイルを使用する例とは異なり、この例では XML ドキュメントを動的に作成し、simplexml_load_string() メソッドを使用して読み込みます。それをSimpleXMLの真ん中に入れます。その後、XML は foreach() ループを使用して解析され、各 要素の type 属性の値に基づいて各形状の面積が計算されます。上記のリストは、各要素の属性に関連付けられた属性配列内のキーとして属性値にアクセスする方法を示しています。

X は点を表します

SimpleXML は、XPath 位置パスを介した要素コレクションのカスタマイズもサポートしています。 XML を初めて使用する人のために説明すると、XPath は、開発者がドキュメント内の要素、属性、またはテキスト ノードのコレクションにアクセスできるようにする標準の XML ドキュメント アドレス指定メカニズムです。 XPath の詳細については、http://www.w3.org/TR/xpath.html および http://www.melonfire.com/community/columns/trog/article.php?id=83 を参照してください
その仕組みを理解するには次の XML ドキュメントを考えてみましょう:

< xml version = " 1.0 " ?> < desc > 2 ; アイテム 1 ; < 数量 >/ アイテム > < アイテム > アイテム > 数量 > > ライムジュース 2 >

; すべての 。前述のように、 要素配列を列挙して 要素を出力することも、xpath() メソッドを使用して のみのカスタム コレクションを作成することもできます。 ? php // XML ファイルの名前を設定 $file = " sinners.xml " // ファイルをロード $xml = simplexml_load_file($file) または die ( " XML ファイルをロードできません! " ) // すべての < desc> 要素と print foreach ($xml -> xpath( ' //desc ' ) as $desc) { echo " $descn " ; > XPath を使用すると、次のことができます。これよりも、 要素のみ (対応する数は 2 以上) のコレクションを作成することで実現できます。

要素と print foreach ($xml -> xpath( ' //item[quantity > 1]/desc ' ) as $desc) { echo " $descn " }?> XPath を使用してこの関数を完成させると、上記の 5 行のコードよりもはるかに複雑になります。自分で実験して、これが当てはまるかどうかを確認してください。

ムーランルージュの夜

XPath で何ができるかを理解したところで、XPath を実際に使用する例を見て終わりにしましょう。

以下に示すように、XML で一連の映画レビューがあると仮定します。

<? XML バージョン = " 1.0 " ?> 120 継続時間 > 2001 年 > したがって、このファイルからデータを抽出し、それを HTML モジュール内の適切な位置に配置するには、PHP スクリプトが必要になります。言ってみれば、これは簡単です、次のように下代が演じている那样:

<; html > <;頭 > <; Basefont face = " Arial " > php echo $xml ->タイトル; ?> ( year; ?> ) <; h3 > ティーザー; ?> h3 > php echo $xml ->体; ?> 監督: php echo $xml ->監督; ?> b > 期間: php echo $xml ->間隔; ?>分 キャスト: php foreach ($xml ->cast ->person as $person) { echo "$person "; } ?> b > 評価: php echo $xml ->評価; ?> b >

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