PHP で XML を読み書きするためのテクニックは数多くあります。この記事では、XML を読み取る 3 つの方法 (DOM ライブラリの使用、SAX パーサーの使用、および正規表現の使用) を説明します。 DOM および PHP テキスト テンプレートを使用した XML の作成についても説明します。
PHP で Extensible Markup Language (XML) を読み書きするのは、少し怖いように思えるかもしれません。実際、XML とそれに関連するすべてのテクノロジは恐ろしいものですが、PHP での XML の読み取りと書き込みは、必ずしも恐ろしい作業である必要はありません。まず、XML とは何なのか、XML を使って何ができるのかについて少し学ぶ必要があります。次に、PHP で XML を読み書きする方法を学ぶ必要があります。これを行う方法はたくさんあります。
この記事では、XML について簡単に説明した後、PHP を使用して XML を読み書きする方法について説明します。
XMLとは何ですか?
XML はデータ保存形式です。どのようなデータが保存されるかは定義されず、データの形式も定義されません。 XML は単にタグとそのタグの属性を定義するだけです。整形式の XML マークアップは次のようになります:
<名前>ジャック・ヘリントン</名前>
この タグには、「Jack Herrington」というテキストが含まれています。
テキストのない XML マークアップは次のようになります:
<パワーアップ/>
XML で何かを記述する方法は複数あります。たとえば、このタグは前のタグと同じ出力を形成します:
<パワーアップ></パワーアップ>
XML タグに属性を追加することもできます。たとえば、この タグには最初と最後の属性が含まれています:
<name first="ジャック" last="ヘリントン" />
XML を使用して特殊文字をエンコードすることもできます。たとえば、& 記号は次のようにエンコードできます:
&
タグと属性を含む XML ファイルは、例のようにフォーマットされていれば 整形式 であり、タグが対称的であり、文字が正しくエンコードされていることを意味します。リスト 1 は、整形式の XML の例です。
リスト1. XML書籍リストの例
リスト 1 の XML には書籍のリストが含まれています。親の タグには一連の タグが含まれており、各タグには 、、および タグが含まれています。
XML ドキュメントは、そのマークアップ構造とコンテンツが外部スキーマ ファイルによって検証される場合、正しいものとなります。スキーマ ファイルはさまざまな形式で指定できます。この記事で必要なのは、整形式の XML だけです。
XML は Hypertext Markup Language (HTML) によく似ていると思うなら、その通りです。 XML と HTML は両方ともマークアップベースの言語であり、多くの類似点があります。ただし、XML ドキュメントは整形式の HTML である場合もありますが、すべての HTML ドキュメントが整形式の XML であるわけではないことに注意することが重要です。改行タグ (br) は、XML と HTML の違いを示す良い例です。この改行タグは整形式の HTML ですが、整形式の XML ではありません:
これは段落です
改行あり</p>
この改行タグは、整形式の XML および HTML です:
これは段落です
改行あり</p>
HTML を整形式 XML として記述したい場合は、W3C 委員会の Extensible Hypertext Markup Language (XHTML) 標準に従ってください (「参考文献」を参照)。最新のブラウザはすべて XHTML をレンダリングできます。さらに、XML ツールを使用すると、XHTML を読み取ってドキュメント内のデータを検索できます。これは、HTML を解析するよりもはるかに簡単です。
DOM ライブラリを使用して XML を読み取る
整形式の XML ファイルを読み取る最も簡単な方法は、一部の PHP インストールにコンパイルされたドキュメント オブジェクト モデル (DOM) ライブラリを使用することです。 DOM ライブラリは、XML ドキュメント全体をメモリに読み取り、それをノード ツリーとして表します (図 1 を参照)。
図 1. 書籍 XML の XML DOM ツリー
ツリーの最上位にある Books ノードには 2 つの book 子タグがあります。各書籍には、著者、出版社、タイトルなどの複数のノードがあります。 author、publisher、title ノードにはそれぞれ、テキストを含むテキスト子ノードがあります。
書籍 XML ファイルを読み取り、DOM を使用してコンテンツを表示するコードをリスト 2 に示します。
リスト 2. DOM を使用して書籍 XML を読み取る
脚本首先创建一个 new DOMdocument 对象,用 load 方法把图书 XML 装入这个对象。之后,脚本用 getElementsByName 方法得到指定名称下的所有元素的列表。
在 book 节点的循环中,脚本用 getElementsByName 方法获得 author、publisher 和 title 标记的 nodeValue。nodeValue 是节点中的文本。脚本然后显示这些值。
可以在命令行上像这样运行 PHP 脚本:
% php e1.php
PHP Hacks - Jack Herrington - OReilly
Podcasting Hacks - Jack Herrington - OReilly
%
可以看到,每个图书块输出一行。这是一个良好的开始。但是,如果不能访问 XML DOM 库该怎么办?
用 SAX 解析器读取 XML
读取 XML 的另一种方法是使用 XML Simple API(SAX)解析器。PHP 的大多数安装都包含 SAX 解析器。SAX 解析器运行在回调模型上。每次打开或关闭一个标记时,或者每次解析器看到文本时,就用节点或文本的信息回调用户定义的函数。
SAX 解析器的优点是,它是真正轻量级的。解析器不会在内存中长期保持内容,所以可以用于非常巨大的文件。缺点是编写 SAX 解析器回调是件非常麻烦的事。清单 3 显示了使用 SAX 读取图书 XML 文件并显示内容的代码。
清单 3. 用 SAX 解析器读取图书 XML
<?php
$g_books = array();
$g_elem = null;
function startElement( $parser, $name, $attrs )
{
global $g_books, $g_elem;
if ( $name == BOOK ) $g_books []= array();
$g_elem = $name;
}
function endElement( $parser, $name )
{
global $g_elem;
$g_elem = null;
}
function textData( $parser, $text )
{
global $g_books, $g_elem;
if ( $g_elem == AUTHOR ||
$g_elem == PUBLISHER ||
$g_elem == TITLE )
{
$g_books[ count( $g_books ) - 1 ][ $g_elem ] = $text;
}
}
$parser = xml_parser_create();
xml_set_element_handler( $parser, "startElement", "endElement" );
xml_set_character_data_handler( $parser, "textData" );
$f = fopen( books.xml, r );
while( $data = fread( $f, 4096 ) )
{
xml_parse( $parser, $data );
}
xml_parser_free( $parser );
foreach( $g_books as $book )
{
echo $book[TITLE]." - ".$book[AUTHOR]." - ";
echo $book[PUBLISHER]."
";
}
?>
|
脚本首先设置 g_books 数组,它在内存中容纳所有图书和图书信息,g_elem 变量保存脚本目前正在处理的
http://www.bkjia.com/PHPjc/508477.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/508477.htmlTechArticle有许多技术可用于用 PHP 读取和编写 XML。本文提供了三种方法读取 XML:使用 DOM 库、使用 SAX 解析器和使用正则表达式。还介绍了使用 DOM 和...