PHP で Extensible Markup Language (XML) を読み書きするのは、少し怖いように思えるかもしれません。実際、XML とそれに関連するすべてのテクノロジは恐ろしいものですが、PHP での XML の読み取りと書き込みは、必ずしも恐ろしい作業である必要はありません。まず、XML とは何なのか、XML を使って何ができるのかについて少し学ぶ必要があります。次に、PHP で XML を読み書きする方法を学ぶ必要があります。これを行う方法はたくさんあります。
この記事では、XML について簡単に紹介し、その後、PHP で XML を読み書きする方法について説明します。
XMLとは何ですか?
XML はデータ保存形式です。どのようなデータが保存されるかは定義されず、データの形式も定義されません。 XML は単にタグとそのタグの属性を定義するだけです。整形式の XML タグは次のようになります:
Jack Herrington
この にはテキストが含まれます: Jack Herrington。
テキストのない XML マークアップは次のようになります:
XML で何かを記述する方法は複数あります。たとえば、このタグは前のタグと同じ出力を形成します:
XML タグに属性を追加することも可能です。たとえば、この タグには、first 属性と last 属性が含まれています。
特殊文字も XML でエンコードできます。たとえば、& 記号は次のようにエンコードできます:
&
タグと属性を含む XML ファイルは、例のようにフォーマットされていれば整形式です。これは、タグが対称であり、文字が正しくエンコードされていることを意味します。リスト 1 は、整形式の XML の例です。
リスト 1. XML 書籍リストの例
コードをコピーする コードは次のとおりです。 < ; タイトル>オライリー出版社>
<著者著者>タイトル>
O'Reilly リスト 1 の XML には書籍のリストが含まれています。親タグ
には一連の が含まれており、各タグには 、、および タグが含まれています。
XML ドキュメントは、そのマークアップ構造とコンテンツが外部スキーマ ファイルによって検証される場合に正しいものです。スキーマ ファイルはさまざまな形式で指定できます。この記事で必要なのは、整形式の XML だけです。
XML がハイパーテキスト マークアップ言語 (HTML) によく似ていると思うなら、それは正しいです。 XML と HTML は両方ともマークアップベースの言語であり、多くの類似点があります。ただし、XML ドキュメントは整形式の HTML である場合もありますが、すべての HTML ドキュメントが整形式の XML であるわけではないことに注意することが重要です。改行タグ (br) は、XML と HTML の違いを示す良い例です。この改行タグは整形式の HTML ですが、整形式の XML ではありません:
これは段落です
改行あり
この改行タグは整形式の XML および HTML です。 :
これは段落です
改行あり
HTML を整形式の XML に書き込む場合は、W3C 委員会の Extensible Hypertext Markup Language (XHTML) 標準に従ってください。 。最新のブラウザはすべて XHTML をレンダリングできます。さらに、XML ツールを使用すると、XHTML を読み取ってドキュメント内のデータを検索できます。これは、HTML を解析するよりもはるかに簡単です。
DOM ライブラリを使用した XML の読み取り
整形式の XML ファイルを読み取る最も簡単な方法は、一部の PHP インストールにコンパイルされたドキュメント オブジェクト モデル (DOM) ライブラリを使用することです。 DOM ライブラリは、XML ドキュメント全体をメモリに読み取り、それをノード ツリーとして表します (図 1 を参照)。
図 1. book XML の XML DOM ツリー
ツリーの最上位にある Books ノードには 2 つの book 子タグがあります。各書籍には、著者、出版社、タイトルなどの複数のノードがあります。 author、publisher、title ノードにはそれぞれ、テキストを含むテキスト子ノードがあります。
書籍 XML ファイルを読み取り、DOM を使用してコンテンツを表示するコードをリスト 2 に示します。
リスト 2. DOM を使用してブック XML を読み取ります
コードをコピーします
コードは次のとおりです:
$doc = new DOMDocument();
$doc->load( 'books.xml' );
$books = $doc->getElementsByTagName( "book" ); $book としての書籍 )
{
$authors = $book->getElementsByTagName( "author" );
$author = $authors->item(0)->nodeValue; getElementsByTagName( "publisher" );
$publisher = $publishers->item(0)->nodeValue;
$titles = $book->getElementsByTagName( "title" ); item(0)->nodeValue;
echo "$title - $author - $publishern";
?>
スクリプトは最初に新しい DOMdocument オブジェクトを作成し、load メソッドを使用して書籍 XML を読み込みます。このオブジェクトに。その後、スクリプトは getElementsByName メソッドを使用して、指定された名前の下にあるすべての要素のリストを取得します。
book ノードのループで、スクリプトは getElementsByName メソッドを使用して、著者、発行者、およびタイトル タグのノード値を取得します。 nodeValue はノード内のテキストです。次に、スクリプトはこれらの値を表示します。
次のようにコマンドラインで PHP スクリプトを実行できます:
% php e1.php
PHP Hacks - Jack Herrington - O'Reilly
Podcasting Hacks - Jack Herrington - O'Reilly
%
各ブックブロックが1行出力します。これは良いスタートです。しかし、XML DOM ライブラリにアクセスできない場合はどうすればよいでしょうか?
SAX パーサーを使用した XML の読み取り
XML を読み取るもう 1 つの方法は、XML Simple API (SAX) パーサーを使用することです。 PHP のほとんどのインストールには SAX パーサーが含まれています。 SAX パーサーはコールバック モデルで実行されます。タグがオープンまたはクローズされるたび、またはパーサーがテキストを参照するたびに、ノードまたはテキストに関する情報を使用してユーザー定義関数がコールバックされます。
SAX パーサーの利点は、本当に軽量であることです。パーサーはコンテンツをメモリ内に長期間保持しないため、非常に大きなファイルにも使用できます。欠点は、SAX パーサー コールバックの作成が面倒なことです。リスト 3 は、SAX を使用して書籍 XML ファイルを読み取り、内容を表示するコードを示しています。
リスト 3. SAX パーサーを使用した書籍 XML の読み取り
コードをコピーします
コードは次のとおりです。 $g_books = array();
function startElement( $parser , $name, $attrs ) {
global $g_books, $g_elem;
if ( $name == 'BOOK' ) $g_books []= array()
$g_elem = $name; endElement( $parser, $name )
{
global $g_elem;
$g_elem = null;
function textData( $parser, $text )
{
global $g_books, $g_elem == '著者' ||
$g_elem == '出版社' ||
$g_elem == 'タイトル' )
{
$g_books[ count( $g_books ) - 1 ][ $g_elem ] = $text;
$ parser = xml_parser_create();
xml_set_element_handler( $parser, "startElement", "endElement" );
$f = fopen( 'books.xml' ); ;
while( $data = fread( $f, 4096 ) )
{
xml_parse( $parser, $data );
}
foreach( $g_books as $book )
{
echo $ book[ 'TITLE']." - ".$book['AUTHOR']." - ";
echo $book['PUBLISHER']."n"
}
スクリプトは最初に設定しますg_books 配列。メモリ内のすべての書籍と書籍情報が保持されます。g_elem 変数は、現在スクリプトによって処理されているタグの名前を保持します。次に、スクリプトはコールバック関数を定義します。この例では、コールバック関数は startElement、endElement、および textData です。マークアップを開くときと閉じるときに、それぞれ startElement 関数と endElement 関数を呼び出します。開始タグと終了タグの間のテキストで textData を呼び出します。
この例では、startElement タグは book 配列内の新しい要素を開始する book タグを探します。次に、textData 関数は現在の要素を調べて、それが発行者、タイトル、または著者タグであるかどうかを確認します。そうである場合、関数は現在のテキストを現在のブックに挿入します。
解析を続行できるようにするために、スクリプトは xml_parser_create 関数を使用してパーサーを作成します。次に、コールバック ハンドルを設定します。その後、スクリプトはファイルを読み取り、ファイルのチャンクをパーサーに送信します。ファイルが読み取られた後、xml_parser_free 関数によってパーサーが削除されます。スクリプトの最後では、g_books 配列の内容が出力されます。
ご覧のとおり、これは DOM に同じ機能を記述するよりもはるかに困難です。 DOM ライブラリも SAX ライブラリも存在しない場合はどうなるでしょうか?代替手段はありますか?
------------------------------------------------- -----------------------------
トップに戻る
正規表現を使用した XML の解析
これについては言及されていますが、確かに一部のエンジニアは私を批判するかもしれませんが、正規表現を使用して XML を解析することは確かに可能です。リスト 4 は、 preg_ 関数を使用してブック ファイルを読み取る例を示しています。
リスト 4. 正規表現を使用した XML の読み取り
コードをコピーします
コードは次のとおりです:
$xml = "";
$f = fopen( 'books.xml', 'r' );
while( $data = fread( $f, 4096 ) ) { $xml .= $データ; }
fclose( $f );
preg_match_all( "/
(.*?)/s",
$xml, $bookblocks ); $block )
{
preg_match_all( "/
(.*?)/",
$block, $author );
preg_match_all( "/
(.*?)< ;/title>/",
$block, $title );
preg_match_all( "/(.*?)/",
$block, $publisher );
echo( $title [1][0]." - ".$author[1][0]." - ".
$publisher[1][0]."n" );このコードがいかに短いかに注目してください。最初に、ファイルを大きな文字列に読み取ります。次に、正規表現関数を使用して、書籍の各項目を読み取ります。最後に、foreach ループを使用して各書籍ブロックをループし、著者、タイトル、発行者を抽出します。
では、欠陥はどこにあるのでしょうか?正規表現コードを使用して XML を読み取る場合の問題は、XML が整形式であるかどうかを最初にチェックしないことです。これは、XML が読み取られるまでは XML が整形式であるかどうかを知る方法がないことを意味します。また、一部の整形式 XML は正規表現と一致しない可能性があるため、後で変更する必要があります。
XML を読み取るために正規表現を使用することはお勧めしませんが、正規表現関数はいつでも使用できるため、これが最も互換性のある方法である場合があります。 XML の形式や構造を制御できないため、正規表現を使用してユーザーから XML を直接読み取らないでください。ユーザーから XML を読み取るには、常に DOM ライブラリまたは SAX パーサーを使用する必要があります。
------------------------------------------------- -----------------------------
トップに戻る DOM を使用した XML の書き込み
XML の読み取りは方程式の一部にすぎません。 XMLはどのように書くのでしょうか? XML を記述する最良の方法は、DOM を使用することです。リスト 5 は、DOM が書籍 XML ファイルを構築する方法を示しています。
リスト 5. DOM を使用した書籍 XML の作成
コードをコピーします
コードは次のとおりです。 ' => 'PHP ハック',
'著者' => 'ジャック・ヘリントン',
'出版社' => "オライリー" ) = array( 'タイトル' => ; 'ポッドキャスティングのハック', '著者' => 'ジャック・ヘリントン', 'パブリッシャー' => $doc = new DOMDocument(); true;
$ r = $doc->createElement( "books" ); $doc->appendChild( $r );
{
$b = $doc-> createElement( "book " );
$author = $doc->createElement( "author" );
$author->appendChild(
$doc->createTextNode( $book['author'] )
);
$b->appendChild( $author );
$title = $doc->createElement( "title" );
$title->appendChild(
$doc->createTextNode( $book['title' ] )
) ;
$b->appendChild( $title );
$publisher = $doc->createElement( "publisher" );
$doc->createTextNode( $ book['publisher '] )
);
$b->appendChild( $publisher );
}
echo $doc->saveXML(); ;
スクリプトの先頭で、書籍のサンプルを含む book 配列を読み込みます。このデータはユーザーまたはデータベースから取得できます。
サンプル ブックがロードされた後、スクリプトは新しい DOMDocument を作成し、それにルート ノード ブックを追加します。次に、スクリプトは各本の著者、タイトル、発行者のノードを作成し、各ノードにテキスト ノードを追加します。各書籍ノードの最後のステップは、それをルートの書籍ノードに再追加することです。
スクリプトの最後で、saveXML メソッドを使用して XML をコンソールに出力します。 (save メソッドを使用して XML ファイルを作成することもできます。) スクリプトの出力をリスト 6 に示します。
リスト 6. DOM ビルド スクリプトの出力
コードをコピーします
コードは次のとおりです。
php e4.php
<本>
<著者著者>
PHPハック
<著者>ジャック・ヘリントン著者><タイトル>ポッドキャスティング>オライリー出版> 書籍>
DOM を使用する本当の価値は、DOM によって作成される XML が常に整形式であることです。しかし、DOM を使用して XML を作成できない場合はどうすればよいでしょうか?
------------------------------------------------- -----------------------------
トップに戻る
PHP で XML を書く
DOM が利用できない場合は、次を使用できますPHP テキスト テンプレートは XML で記述されます。リスト 7 は、PHP が書籍 XML ファイルを構築する方法を示しています。
リスト 7. PHP での書籍 XML の作成
コードをコピーします コードは次のとおりです。 ' => 'PHP ハック',
'著者' => 'ジャック・ヘリントン', '出版社' => "オライリー"
) = array(
'タイトル' => ; 'ポッドキャスティング ハック'、
'著者' => "オライリー"
; $books として $ book )
{
?>
}
?>
スクリプトの上部は DOM スクリプトに似ています。スクリプトの最後では、books タグを開き、各書籍を反復処理して、book タグとすべての内部タイトル、著者、出版社のタグを作成します。
このアプローチの問題は、エンティティのエンコードです。エンティティが正しくエンコードされていることを確認するには、リスト 8 に示すように、各項目に対して htmlentities 関数を呼び出す必要があります。
リスト 8. htmlentities 関数を使用したエンティティのエンコード
コードをコピーします
コードは次のとおりです。 title = htmlentities( $book['title'] , ENT_QUOTES );
$author = htmlentities( $book['author'] , ENT_QUOTES );
$publisher = htmlentities( $book['publisher'] ); ?>
<タイトル<著者> ?> ;
これは、基本的な PHP で XML を記述する場合の面倒な点です。完璧な XML を作成したと思っていても、データを使用しようとするとすぐに、一部の要素が正しくエンコードされていないことがわかります。 ------------------------------------------------- ---------------------------------- 結論 XML には誇張と混乱がたくさんあります。ただし、特に PHP のような優れた言語では、それは思っているほど難しくありません。 XML を正しく理解して実装すると、多くの強力なツールを自由に使用できるようになります。 XPath と XSLT は、調査する価値のある 2 つのツールです。
http://www.bkjia.com/PHPjc/322974.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/322974.html
技術記事
PHP で Extensible Markup Language (XML) を読み書きするのは、少し怖いように思えるかもしれません。実際、XML とそれに関連するすべてのテクノロジーは恐ろしいものですが、PHP で XML を読み書きすることは怖くありません...