ホームページ  >  記事  >  php教程  >  PHP5 の新しい XML 機能

PHP5 の新しい XML 機能

WBOY
WBOYオリジナル
2016-06-21 09:09:27895ブラウズ

php5|xml

対象読者

この記事は、PHP5 の新しい XML 機能に興味のある、あらゆるレベルのすべての PHP 開発者を対象としています。読者が XML の基本的な知識を持っていることを前提としています。ただし、すでに PHP で XML を使用している場合にも、この記事の恩恵を受けることができます。

はじめに

今日のインターネットの世界では、XML はもはやバズワードではなく、広く受け入れられ、標準化されています。したがって、PHP4 と比較して、PHP5 の XML サポートはより注目を集めています。 PHP4 では、ほとんどの場合、非標準、API の破損、メモリ リーク、その他の不完全な機能に直面します。 PHP 4.3 ではいくつかの欠陥が改善されましたが、開発者は元のコードを放棄し、コード全体を PHP5 で書き直すことにしました。

この記事では、PHP5 の XML の魅力的な新機能をすべて 1 つずつ紹介します。

PHP4 の XML

PHP の初期のバージョンではすでに XML がサポートされており、これはあらゆる XML ドキュメントを簡単に解析できる SAX ベースのインターフェイスにすぎません。 PHP4 に DOMXML 拡張モジュールが追加されたことで、XML のサポートが強化されました。その後、XSLT が補足として追加されました。 PHP 4 の段階を通じて、HTML、XSLT、DTD 検証などの他の機能も DOMXML 拡張機能に追加されました。残念ながら、XSLT および DOMXML 拡張機能は常に実験段階にあり、API 部分は複数回変更されています。デフォルトではまだインストールできません。さらに、DOMXML 拡張機能は、W3C によって確立された DOM 標準に従っていませんが、独自の命名方法を持っています。この部分は PHP 4.3 で改善され、多くのメモリ リークやその他の機能が修正されましたが、安定した段階まで発展することはなく、いくつかの深刻な問題は修正がほぼ不可能になっています。デフォルトでは、SAX 拡張機能のみがインストールされます。他の拡張機能は広く使用されません。

これらすべての理由から、PHP の XML 開発者は、すべてのコードを PHP5 で書き直し、使用標準に従うことにしました。

XML for PHP5
XML をサポートするすべての部分が PHP5 でほぼ完全に書き直され、すべての XML 拡張機能は GNOME プロジェクトの LIBXML2 ライブラリに基づいています。これにより、さまざまな拡張モジュールが相互運用できるようになり、コア開発者は基礎となるライブラリを開発するだけで済みます。たとえば、XML 関連のすべての拡張機能は、複雑なメモリ管理を 1 回実装するだけで改善できます。

PHP4 で有名な SAX パーサーを継承することに加えて、PHP5 は W3C 標準に準拠した DOM と LIBXSLT エンジンに基づく XSLT もサポートします。同時に、PHP 独自の SimpleXML 拡張機能と標準準拠の SOAP 拡張機能も追加されています。 XML の重要性がますます高まるにつれ、PHP 開発者は、デフォルトのインストール方法に XML のサポートを追加することを決定しました。これは、SAX、DOM、および SimpleXML を使用できるようになり、これらの拡張機能がより多くのサーバーにインストールされることを意味します。次に、PHP のコンパイル時に XSLT と SOAP のサポートを明示的に構成する必要があります。

データ ストリームのサポート

すべての XML 拡張機能は、PHP から直接アクセスしない場合でも、PHP データ ストリームをサポートするようになりました。たとえば、PHP5 では、ファイルまたはディレクティブからデータ ストリームにアクセスできます。基本的に、通常のファイルにアクセスできる場所ならどこからでも PHP データ ストリームにアクセスできます。

データ フローは PHP4.3 で簡単に導入されましたが、PHP5 ではさらに改良され、ファイル アクセス、ネットワーク アクセス、および一連の機能関数の共有などのその他の操作が含まれます。 PHP コードを使用して独自のデータ フローを実装することもできるため、データ アクセスが非常に簡単になります。この部分の詳細については、PHP ドキュメントを参照してください。

SAX

SAX の正式名称は Simple API for XML であり、コールバック形式に基づいた XML ドキュメントを解析するためのインターフェイスです。 SAX は PHP3 からサポートされており、現在まで大きな変更はありません。 PHP5 では API インターフェイスは変更されていないため、コードは引き続き実行されます。唯一の違いは、EXPAT ライブラリではなく、LIBXML2 ライブラリに基づいていることです。

この変更により、名前空間のサポートにいくつかの問題が発生しましたが、LIBXML2.2.6 バージョンでは解決されました。ただし、LIBXML2 の以前のバージョンでは解決されていないため、xml_parse_create_ns(); を使用する場合は、システムに LIBXML2.2.6 をインストールすることを強くお勧めします。

DOM

DOM (Document Object Model) は、XML ドキュメント ツリーにアクセスするために W3C によって開発された一連の標準です。 PHP4 では、DOMXML を使用してこれを行うことができます。DOMXML の主な問題は、標準の命名方法に準拠していないことです。そして、メモリリークの問題は長い間存在していました (PHP4.3 ではこの問題が修正されています)。

新しい DOM 拡張機能は W3C 標準に基づいており、メソッド名と属性名が含まれています。 JavaScript などの他の言語の DOM に慣れている場合は、PHP で同様の機能を記述するのは非常に簡単です。メソッドとパラメータは同じであるため、毎回ドキュメントを確認する必要はありません。

新しい W3C 標準のため、DOMXML ベースのコードは実行されません。 PHP の API は大きく異なります。ただし、コードで W3C 標準と同様のメソッド命名方法が使用されている場合、移植はそれほど難しくありません。必要なのは、load 関数と save 関数を変更し、関数名のアンダースコアを削除することだけです (DOM 標準では最初の文字に大文字が使用されます)。もちろん他の部分の調整は必要ですが、主なロジックは変更しないでかまいません。

DOM を読む

この記事では、DOM 拡張機能のすべての機能については説明しません。その必要はありません。 HTTP://www.w3.org/DOM のドキュメントをブックマークしておくとよいでしょう。基本的にはPHP5のDOM部分と同じです。

この投稿のほとんどの例では同じ XML ファイルを使用します。非常に単純な RSS バージョンが zend.com で入手できます。以下のテキストをテキスト ファイルに貼り付け、articles.xml として保存します。





http://www.zend.com/zend/week/week172.php



http://www.zend.com/zend/tut/tut-hatwar3.php



この例を DOM オブジェクトにロードするには、まず DOMDocument オブジェクトを作成してから、XML ファイルをロードします。

$dom = new DomDocument();
$dom->load("articles.xml");

上記のように、PHP のデータ ストリームを使用して XML ドキュメントを読み込むことができます。 :

$dom->load("file:///articles.xml");

(または他のタイプのデータ ストリーム)

XML ドキュメントをブラウザに出力するか、標準マークとして出力する場合は、使用:

print $dom->saveXML();

ファイルとして保存したい場合は、次を使用してください:

print $dom->save("newfile.xml");これを行うとファイル サイズが stdout に送信されます)

もちろん、この例にはそれほど多くの機能はありません。もっと便利なことをやってみましょう。すべてのタイトル要素を取得しましょう。これを行うには多くの方法がありますが、最も簡単なのは getElementsByTagName($tagname):

$titles = $dom->getElementsByTagName("title");
foreach($titles as $node) {
print $node を使用することです。 - >textContent . "n";

textContent 属性は W3C 標準ではありません。W3C 標準の読み方は次のとおりです。 ;firstChild->data;

(この時点で、firstChild ノードが必要なテキスト ノードであることを確認する必要があります。そうでない場合は、すべての子ノードを検索して見つける必要があります)。

もう 1 つ注意すべき点は、getElementsByTagName() は PHP4 の get_elements_by_tagname() のような配列ではなく、DomNodeList オブジェクトを返すことです。ただし、この例でわかるように、これを走査する foreach ステートメントを簡単に使用できます。 $titles->item(0) を使用してノードに直接アクセスすることもできます。このメソッドは最初のタイトル要素を返します。

すべてのタイトル要素を取得する別の方法は、ルート ノードからトラバースすることです。ご覧のとおり、この方法はより複雑ですが、タイトル要素以上のものが必要な場合は、この方法の方がより柔軟です。

foreach ($dom->documentElement->childNodes as $articles) {
//ノードが要素 (nodeType == 1) で名前が item の場合、ループを継続します
if ($articles-> nodeType = = 1 && $articles->nodeName == "item") {
foreach ($articles->childNodes as $item) {
//ノードが要素で名前が title の場合、それを出力します。
if ( $item->nodeType == 1 && $item->nodeName == "title") {
print $item->textContent . "n" }
}
}
}

XPath
XPaht SQL for XML と同様に、XPath を使用すると、パターン構文に一致する特定のノードについて XML ドキュメントをクエリできます。 XPath を使用してすべてのタイトル ノードを取得したい場合は、次のようにします。


$xp = new domxpath($dom);
$titles = $xp->query("/articles/item/title");
foreach ($titles as $node) {
print $node->textContent . "n";
?>

これは getElementsByTagName() メソッドの使用と似ていますが、Xpath の方がはるかに強力です。たとえば、タイトル要素が (アイテムの子要素ではなく) 記事の子要素である場合、getElementsByTagName() はそれを返します。 /articles/item/title 構文を使用すると、指定された深さと位置にある title 要素のみが取得されます。これは単なる例であり、さらに深く掘り下げると、次のようになります:

/articles/item[position() = 1]/title すべてを返します

/articles/item/title[@id = ' 23'] id 属性を含み、値が 23 であるすべてのタイトルを返します

/articles//titlearticles 要素の下にあるすべてのタイトルを返します (翻訳者注: // は任意の深さを表します)

特別な兄弟要素、特別なテキスト コンテンツを持つ要素を含むポイントをクエリしたり、名前空間などを使用したりすることもできます。大量の XML ドキュメントをクエリする必要がある場合、XPath の適切な使用方法を学習すると、使用する時間が大幅に節約され、標準 DOM よりも必要なコードが少なくなります。

DOM へのデータの書き込み
ドキュメント オブジェクト モデルは、読み取りとクエリだけでなく、操作や書き込みも行うことができます。 (DOM 標準は、作成者が考えられるすべての環境をサポートしたいと考えていたため、少し長くなりますが、非常にうまく機能します)。次の例を見てください。article.xml ファイルに新しい要素が追加されています。

$item = $dom->createElement("item");
$title = $dom->createElement("title");
$titletext = $dom->createTextNode("PHP5 の XML") ;
$title->appendChild($titletext);
$dom->documentElement->appendChild($item); );

まず、すべての必要なノード、item 要素、title 要素、およびアイテムのタイトルを含むテキスト ノードを作成します。次に、すべてのノードをリンクし、テキスト ノードを title 要素に追加します。 item 要素に追加し、最後に item 要素を記事のルート要素に挿入します。 XML ドキュメントに新しい記事リストが追加されました。

拡張クラス(クラス)
さて、上記の例は、PHP4 で DOMXML 拡張機能を使用して実行できます (API が少し異なるだけです)。DOM クラスを自分で拡張できるのは、より多くの記述が可能になる PHP5 の新機能です。 . 読み取り可能なコードが可能になります。 DOMDocument クラスを使用して書き直された例全体を次に示します。

class Articles extends DomDocument {
function __construct() {
// 必ず呼び出す必要があります!
parent::__construct() }

function addArticle($title) {
$item = $this->createElement("item");
$titlespace = $this->createElement("title");
$titletext = $this->createTextNode($title); - >appendChild($titletext);
$item->appendChild($titlespace);
}
}
$dom = new Articles();
$dom->load("articles.xml");
$dom->addArticle("PHP5 の XML");

HTML
PHP5 見過ごされがちな機能の 1 つは、libxml2 ライブラリの HTML サポートです。DOM 拡張機能を使用して整形式の XML ドキュメントをロードできるだけでなく、整形式でない XML ドキュメントを )HTML ドキュメントとして扱うこともできます。 XPath や SimpleXML など、利用可能なすべてのメソッドと機能を使用した標準 DOMDocument オブジェクト。

HTML のパフォーマンスは、制御できないサイト上のコンテンツにアクセスする必要がある場合に非常に役立ちます。 XPath、XSLT、または SimpleXML を使用すると、正規表現を使用して文字列を比較したり、SAX パーサーを使用したりするなど、多くのコードを節約できます。これは、HTML ドキュメントが適切に構造化されていない場合 (よくある問題です!) に特に役立ちます。

次のコードは、php.net のホームページを取得して解析し、最初の title 要素のコンテンツを返します。

$dom = new DomDocument();
$dom->loadHTMLFile("http://www.php.net/");
$title = $dom->getElementsByTagName("title"); $title->item(0)->textContent;

指定された要素が見つからない場合、出力にエラーが含まれる可能性があることに注意してください。 Web サイトがまだ PHP を使用して HTML4 コードを出力している場合、DOM 拡張機能は HTML ドキュメントを読み込むだけでなく、HTML4 形式のファイルとして保存することもできるという朗報があります。 DOM ドキュメントを追加した後、$dom->saveHTML() を使用して保存します。なお、出力するHTMLコードをW3C規格に準拠させるには、tidy extension(tidy extension)を使用しないほうがよいでしょう。 Libxml2 ライブラリでサポートされる HTML は、あらゆる事態を考慮しておらず、非汎用形式の入力を適切に処理しません。

検証
XML ドキュメントの検証はますます重要になってきています。たとえば、外部リソースから XML ドキュメントを取得した場合、それを処理する前に、それが特定の形式に準拠しているかどうかを確認する必要があります。幸いなことに、最も広く使用されている 3 つの標準 (DTD、XML スキーマ、または RelaxNG) のいずれかを使用して検証できるため、PHP で独自のバリデータを作成する必要はありません。

DTD は SGML 時代に生まれた標準であり、XML の新しい機能 (名前空間など) がいくつか欠けており、XML で記述されていないため、解析や変換も困難です。
XML スキーマイは W3C によって開発された標準であり、広く使用されており、XML ドキュメントを検証するために必要なほとんどすべてが含まれています。
RelaxNG は、複雑な XML スキーマ標準に相当するもので、Libertarian Organization によって作成されました。XML スキーマよりも実装が簡単であるため、ますます多くのプログラムが RelaxNG をサポートし始めています。従来の計画ドキュメントや非常に複雑な XML ドキュメントがない場合は、RelaxNG を使用してください。書き込みと読み取りは比較的簡単で、これをサポートするツールはますます増えています。 XML テンプレートから RelaxNG ドキュメントを自動的に作成できる Trang というツールもあります。また、libxml2 は RelaxNG (および古い DTDS) のみを完全にサポートしていますが、libxml2 は ML スキーマも完全にサポートする予定です。

XML ドキュメントを検証するための構文は非常に単純です:

$dom->validate('articles.dtd');
$dom->relaxNGValidate('articles.rng'); ('articles.xsd');
現在、これらはすべて単に true または false を返し、エラーは PHP 警告として出力されます。ユーザーフレンドリーな情報を返すのは明らかに良い考えではありません。これは PHP 5.0 以降のバージョンで改善される予定です。これがどのように正確に実装されるかはまだ議論中ですが、エラー報告は間違いなくより適切に処理されるでしょう。

SimpleXML
SimpleXML は、PHP の XML ファミリーに追加された最後のメンバーです。SimpleXML 拡張機能を追加する目的は、標準のオブジェクト プロパティとイテレーターを使用して XML ドキュメントにアクセスする簡単な方法を提供することです。この拡張機能には多くのメソッドはありませんが、それでも非常に強力です。ドキュメントからすべてのタイトル ノードを取得するのに必要なコードは以前よりも少なくなります。

$sxe = simplexml_load_file("articles.xml");
foreach($sxe->item as $item) {
print $item->title ."n";

何をしているのですか?まず、articles.xml を SimpleXML オブジェクトにロードします。次に、$sxe 内のすべての item 要素を取得し、最後に $item->title が title 要素のコンテンツを返すだけです。 $item->title['id'] を使用して、連想配列を使用して属性をクエリすることもできます。

これは本当に素晴らしいことです。たとえば、$item->title[0] は例と同じ結果を返します。 $sxe->item->title as $item) は、ドキュメント内のすべてのタイトル要素ではなく、最初のタイトルのみを返します。 (XPath で予想していたとおりです)。

SimpleXML は、実際には、Zend Engine 2 の新機能を使用する最初の拡張機能です。したがって、これはこれらの新機能のテスト ポイントとなり、開発段階ではバグや予期せぬエラーが発生することは珍しくありません。

上記の例で使用されているすべてのノードを走査する方法に加えて、SimpleXML には XPath インターフェイスもあり、単一のノードにアクセスする簡単な方法を提供します。

foreach($sxe->xpath('/articles/item/title') as $item) {
print $item . "n";

このコードが前のコードより優れていることは否定できません。例 短いですが、より複雑な XML ドキュメントや深くネストされた XML ドキュメントの場合、SimpleXML で XPath を使用すると、入力の手間が大幅に節約されることがわかります。

SimpleXML ドキュメントにデータを書き込む
SimpleXML を解析して読み取るだけでなく、SimpleXML ドキュメントを変更することもできます。少なくともいくつかの拡張機能を追加します:

$sxe->item->title = "XML in PHP5 "; //title 要素の新しいコンテンツ。
$sxe->item->title['id'] = 34; // title 要素の新しい属性。
$xmlString = $sxe->asXML(); // SimpleXML オブジェクトをシリアル化された XML 文字列として返します

相互運用性
SimpleXML は libxml2 ライブラリに基づいているため、SimpleXML オブジェクトを簡単に変換できます速度にほとんど影響を与えない DomDocument オブジェクト。 (ドキュメントを内部的にコピーする必要はありません)。このメカニズムにより、2 つのオブジェクトの最良の部分が得られます。次のように使用します。 $dom);
$dom = dom_import_simplexml($sxe);
XSLT
XSLT は、XML ドキュメントを他の XML ドキュメントに変換するために使用される言語であり、プログラムで使用されます。処理言語とオブジェクト指向言語 (PHP など) は異なります。 PHP4 には、Sablotron (広く使用されている XSLT 拡張機能) と Libxslt (domxml 拡張機能) という 2 つの XSLT プロセッサがあります。これら 2 つの API は相互に互換性がなく、使用方法も異なります。 PHP5 は libxslt プロセッサのみをサポートします。これは、Libxml2 に基づいており、PHP5 の XML 概念により近いため選択されました。

Sablotron を PHP5 にバインドすることは理論的には可能ですが、残念ながら誰もそれを行っていません。したがって、Sablotron を使用している場合は、PHP5 の libxslt プロセッサに切り替える必要があります。 Libxslt は、JavaScript 例外処理サポートを備えた Sablotron であり、PHP の強力なデータ フローを使用して Sablotron の独自のスキーム ハンドラーを再実装することもできます。さらに、libxslt は最速の XSLT プロセッサの 1 つであるため、無料で速度を向上させることができます。 (実行速度はサブロトロンの2倍)。

この記事で説明する他の拡張機能と同様に、XSL 拡張機能と DOM 拡張機能の間で XML ドキュメントを交換することも、その逆も行うことができます。これは、EXT/XSL 拡張機能には XML ドキュメントのみをロードおよび保存するためのインターフェイスがないためです。 DOM 拡張機能を使用できます。 XSLT 変換の学習を開始する場合、この API は Mozilla から「借用」されているため、ここには W3C 標準はありません。

まず XSLT スタイルシートが必要で、次のテキストを新しいファイルに貼り付けて記事を保存します


/* XML ドキュメントと XSL ドキュメントを DOMDocument オブジェクトに読み込みます*/
$xsl = new DomDocument(); ;load("articles.xsl");
$inputdom = new DomDocument();
$inputdom->load("articles.xml");

/* XSLT プロセッサを作成し、スタイル シートをインポートします*/ $proc = new XsltProcessor();
$xsl = $proc->importStylesheet($ xsl);
$proc->setParameter(null, "titles", "Titles"); document*/
$newdom = $proc->transformToDoc($inputdom);
print $newdom->saveXML();

?> 上の例では、最初に DOM メソッドload() を使用してXSLT スタイル シートarticles.xsl を作成し、後でインポートされる新しい XsltProcessor オブジェクトを作成します。 XSLT スタイルシート オブジェクトを使用するには、パラメータを次のように設定します。 setParameter(namespaceURI, name, value) 最後に、XsltProcessor オブジェクトは、transformToDoc を使用します。 ($inputdom) は変換を開始し、新しい DOMDocument オブジェクトを返します。

。この API の利点は、transformToDoc() 関数をさまざまな XML ドキュメントに適用できるため、同じスタイルシートを使用して多くの XML ドキュメントを変換できることです。一度読み込むだけで再利用できます。

transformToDoc() に加えて、変換には 2 つのメソッドがあります。transformToXML($dom) は文字列を返し、transformToURI($dom, $uri) は変換されたドキュメントをファイルまたは PHP データ ストリームに保存します。 indent="yes" などの XSLT 構文を使用する場合は、変換結果を文字列またはファイルに直接保存する場合にのみ、DOMDocument オブジェクトがこの情報を保存できないため、transformToDoc() を使用できないことに注意してください。これをして。

PHP 関数の呼び出し
XSLT 拡張機能の最後に新たに追加された機能は、XSLT スタイル シート内で任意の PHP 関数を呼び出す機能です。この機能は、正統派 XML サポーターには絶対に好まれません (このようなスタイル シートは少し複雑で、混乱しやすいです)。ロジックやデザインなど)、いくつかの場所で非常に役立ちます。 XSLT は関数に関しては非常に制限されており、異なる言語で日付を出力しようとしても非常に面倒です。しかし、この機能を使用すると、PHP だけを使用するのと同じくらい簡単にこれを処理できます。 XSLT に関数を追加するコードは次のとおりです。



function dateLang () {
return strftime("%A")
}

$xsl = new DomDocument(); " datetime.xsl");
$inputdom = new DomDocument();

$proc = new XsltProcessor(); ;

// ドキュメントをロードし、$xsl を使用して処理します
$xsl = $proc->importStylesheet($xsl);

/* XML ドキュメントを変換して出力します*/
$newdom = $proc-> ;transformToDoc( $inputdom);

print $newdom->saveXML();

?> 以下は、この関数を呼び出す XSLT スタイル シート datetime.xsl です。








以下は、スタイルシートを使用して変換される XML 文書、today.xml です (同様に、articles.xml も同じ結果が得られます)。




上記のスタイルシート、PHPスクリプト、およびすべてのXMLファイルは、現在のシステム設定の言語で週の名前を出力します。 php:function() にパラメータを追加すると、追加されたパラメータが PHP 関数に渡されます。関数 php:functionString() があります。この関数はすべての入力パラメータを文字列に自動的に変換するため、PHP で変換する必要はありません。

変換前に $xslt->registerPhpFunctions() を呼び出す必要があることに注意してください。そうしないと、セキュリティ上の理由から PHP 関数呼び出しが実行されません (XSLT スタイルシートを常に信頼していますか?)。現時点ではアクセスシステムは実装されていませんが、おそらく将来のバージョンの PHP5 でこの機能が実装されるでしょう。

概要
PHP の XML サポートは、標準に準拠しており、強力で、相互運用性があり、共同作業が可能であり、デフォルトのオプションとしてインストールされ、使用が許可されています。新しく追加された SimpleXML 拡張機能は、XML ドキュメントにアクセスする簡単かつ迅速な方法を提供します。これにより、特に構造化されたドキュメントがある場合や強力な XPath を使用できる場合に、多くのコードを節約できます。

PHP5 XML 拡張機能で使用される基礎となるライブラリである libxml2 のおかげで、DTD、RelaxNG、または XML スキーマを使用した XML ドキュメントの検証がサポートされるようになりました。

XSL サポートも刷新され、Libxslt ライブラリを使用するようになりました。これにより、元の Sablotron ライブラリよりもパフォーマンスが大幅に向上しました。さらに、XSLT スタイル シート内で PHP 関数を呼び出すことで、より強力な XSLT コードを作成できるようになりました。

PHP4 または他の言語で XML を使用したことがある場合は、PHP5 の XML 機能が気に入っていただけるでしょう。XML は PHP5 では大幅に変更されており、標準に準拠しており、他のツールや言語と同等です。



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