ホームページ  >  記事  >  バックエンド開発  >  PHP_PHP を使用した XML DOM の読み書きのための実装コードのチュートリアル

PHP_PHP を使用した XML DOM の読み書きのための実装コードのチュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:31:39741ブラウズ

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

<著者>ジャック・ヘリントン<タイトル>ポッドキャスティング>オライリー



DOM を使用する本当の価値は、DOM によって作成される XML が常に整形式であることです。しかし、DOM を使用して XML を作成できない場合はどうすればよいでしょうか?
------------------------------------------------- -----------------------------
トップに戻る
PHP で XML を書く
DOM が利用できない場合は、次を使用できますPHP テキスト テンプレートは XML で記述されます。リスト 7 は、PHP が書籍 XML ファイルを構築する方法を示しています。
リスト 7. PHP での書籍 XML の作成
コードをコピーします コードは次のとおりです。 ' => 'PHP ハック',
'著者' => 'ジャック・ヘリントン',
'出版社' => "オライリー"
) = array(
'タイトル' => ; 'ポッドキャスティング ハック'、
'著者' => "オライリー"
; $books として $ book )
{
?>
<?php echo( $book['title'] ); <br><author> <?php echo( $book['author'] ); <br></author><?php echo( $book['author'] ); /publisher> <br> </book> <br><?php <BR>} <BR>?> <br><br> <br><br> スクリプトの上部は DOM スクリプトに似ています。スクリプトの最後では、books タグを開き、各書籍を反復処理して、book タグとすべての内部タイトル、著者、出版社のタグを作成します。 <br>このアプローチの問題は、エンティティのエンコードです。エンティティが正しくエンコードされていることを確認するには、リスト 8 に示すように、各項目に対して htmlentities 関数を呼び出す必要があります。 <br>リスト 8. htmlentities 関数を使用したエンティティのエンコード <br><br><br><br> コードをコピーします <br><br> コードは次のとおりです。 title = htmlentities( $book['title'] , ENT_QUOTES ); <br>$author = htmlentities( $book['author'] , ENT_QUOTES ); <br>$publisher = htmlentities( $book['publisher'] ); ?> <br><タイトル<?php echo( $title ); <br><著者><?php echo( $author ); ;/著者><?php echo( $publisher> </div><?php <br>?> ; <br><br> <br> <br>これは、基本的な PHP で XML を記述する場合の面倒な点です。完璧な XML を作成したと思っていても、データを使用しようとするとすぐに、一部の要素が正しくエンコードされていないことがわかります。 <div class="codetitle">------------------------------------------------- ---------------------------------- <span style="CURSOR: pointer" onclick="doCopy('code15147')">結論<u> XML には誇張と混乱がたくさんあります。ただし、特に PHP のような優れた言語では、それは思っているほど難しくありません。 XML を正しく理解して実装すると、多くの強力なツールを自由に使用できるようになります。 XPath と XSLT は、調査する価値のある 2 つのツールです。 </u> </span> </div> <div class="codebody" id="code15147">http://www.bkjia.com/PHPjc/322974.html<br><br>www.bkjia.com<br><br>tru​​e<br><br>http://www.bkjia.com/PHPjc/322974.html<br><br>技術記事<br><br> PHP で Extensible Markup Language (XML) を読み書きするのは、少し怖いように思えるかもしれません。実際、XML とそれに関連するすべてのテクノロジーは恐ろしいものですが、PHP で XML を読み書きすることは怖くありません... <br><br><br><br> <br><br> </div></strong></div><div class="nphpQianMsg"><div class="clear"></div></div><div class="nphpQianSheng"><span>声明:</span><div>この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。</div></div></div><div class="nphpSytBox"><span>前の記事:<a class="dBlack" title="PHP開発でよく使われる文字列操作関数_PHPチュートリアル" href="http://m.php.cn/ja/faq/309460.html">PHP開発でよく使われる文字列操作関数_PHPチュートリアル</a></span><span>次の記事:<a class="dBlack" title="PHP開発でよく使われる文字列操作関数_PHPチュートリアル" href="http://m.php.cn/ja/faq/309462.html">PHP開発でよく使われる文字列操作関数_PHPチュートリアル</a></span></div><div class="nphpSytBox2"><div class="nphpZbktTitle"><h2>関連記事</h2><em><a href="http://m.php.cn/ja/article.html" class="bBlack"><i>続きを見る</i><b></b></a></em><div class="clear"></div></div><ins class="adsbygoogle" style="display:block" data-ad-format="fluid" data-ad-layout-key="-6t+ed+2i-1n-4w" data-ad-client="ca-pub-5902227090019525" data-ad-slot="8966999616"></ins><script> (adsbygoogle = window.adsbygoogle || []).push({}); </script><ul class="nphpXgwzList"><li><b></b><a href="http://m.php.cn/ja/faq/1.html" title="cURL を使用して PHP で Get リクエストと Post リクエストを実装する方法" class="aBlack">cURL を使用して PHP で Get リクエストと Post リクエストを実装する方法</a><div class="clear"></div></li><li><b></b><a href="http://m.php.cn/ja/faq/1.html" title="cURL を使用して PHP で Get リクエストと Post リクエストを実装する方法" class="aBlack">cURL を使用して PHP で Get リクエストと Post リクエストを実装する方法</a><div class="clear"></div></li><li><b></b><a href="http://m.php.cn/ja/faq/1.html" title="cURL を使用して PHP で Get リクエストと Post リクエストを実装する方法" class="aBlack">cURL を使用して PHP で Get リクエストと Post リクエストを実装する方法</a><div class="clear"></div></li><li><b></b><a href="http://m.php.cn/ja/faq/1.html" title="cURL を使用して PHP で Get リクエストと Post リクエストを実装する方法" class="aBlack">cURL を使用して PHP で Get リクエストと Post リクエストを実装する方法</a><div class="clear"></div></li><li><b></b><a href="http://m.php.cn/ja/faq/2.html" title="正規表現内のすべての式記号 (概要)" class="aBlack">正規表現内のすべての式記号 (概要)</a><div class="clear"></div></li></ul></div></div><ins class="adsbygoogle" style="display:block" data-ad-format="autorelaxed" data-ad-client="ca-pub-5902227090019525" data-ad-slot="5027754603"></ins><script> (adsbygoogle = window.adsbygoogle || []).push({}); </script><footer><div class="footer"><div class="footertop"><img src="/static/imghwm/logo.png" alt=""><p>福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!</p></div><div class="footermid"><a href="http://m.php.cn/ja/about/us.html">私たちについて</a><a href="http://m.php.cn/ja/about/disclaimer.html">免責事項</a><a href="http://m.php.cn/ja/update/article_0_1.html">Sitemap</a></div><div class="footerbottom"><p> © php.cn All rights reserved </p></div></div></footer><script>isLogin = 0;</script><script type="text/javascript" src="/static/layui/layui.js"></script><script type="text/javascript" src="/static/js/global.js?4.9.47"></script></div><script src="https://vdse.bdstatic.com//search-video.v1.min.js"></script><link rel='stylesheet' id='_main-css' href='/static/css/viewer.min.css' type='text/css' media='all'/><script type='text/javascript' src='/static/js/viewer.min.js?1'></script><script type='text/javascript' src='/static/js/jquery-viewer.min.js'></script><script>jQuery.fn.wait = function (func, times, interval) { var _times = times || -1, //100次 _interval = interval || 20, //20毫秒每次 _self = this, _selector = this.selector, //选择器 _iIntervalID; //定时器id if( this.length ){ //如果已经获取到了,就直接执行函数 func && func.call(this); } else { _iIntervalID = setInterval(function() { if(!_times) { //是0就退出 clearInterval(_iIntervalID); } _times <= 0 || _times--; //如果是正数就 -- _self = $(_selector); //再次选择 if( _self.length ) { //判断是否取到 func && func.call(_self); clearInterval(_iIntervalID); } }, _interval); } return this; } $("table.syntaxhighlighter").wait(function() { $('table.syntaxhighlighter').append("<p class='cnblogs_code_footer'><span class='cnblogs_code_footer_icon'></span></p>"); }); $(document).on("click", ".cnblogs_code_footer",function(){ $(this).parents('table.syntaxhighlighter').css('display','inline-table');$(this).hide(); }); $('.nphpQianCont').viewer({navbar:true,title:false,toolbar:false,movable:false,viewed:function(){$('img').click(function(){$('.viewer-close').trigger('click');});}}); </script></body></html>