PHPでは、XMLデータを処理する多くの方法があります。その中には、 XML_PARSE()およびSimplexML_Load_String()が2つの最も一般的な方法です。これらは両方とも解析XMLを実装できますが、使用、基礎となるメカニズム、柔軟性などには大きな違いがあります。この記事では、基本的な使用、類似性と相違点、それぞれの利点と短所の3つの側面から分析します。
XML_PARSE()は、PHPが提供する基礎となるXMLパーサーの1つであり、イベント駆動型(SAX)モデルに基づいて解析されます。パーサーが開始タグ、エンドタグ、文字データに遭遇すると、事前に定義したコールバック関数を呼び出します。
サンプルコード:
function startElement($parser, $name, $attrs) {
echo "タグを開始します: $name\n";
}
function endElement($parser, $name) {
echo "タグを終了します: $name\n";
}
function characterData($parser, $data) {
echo "コンテンツ: " . trim($data) . "\n";
}
$xmlData = <<<XML
<note>
<to>User</to>
<from>Admin</from>
<message>訪問してください http://m66.net</message>
</note>
XML;
$parser = xml_parser_create();
xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");
if (!xml_parse($parser, $xmlData, true)) {
die("XML 解析エラー: " . xml_error_string(xml_get_error_code($parser)));
}
xml_parser_free($parser);
対照的に、 Simplexml_load_string()はDOMベースの解析方法です。 XMLドキュメント全体をオブジェクトに解析し、開発者は配列またはオブジェクトプロパティにアクセスするなどのXMLノードにアクセスできるため、より直感的に使用できます。
サンプルコード:
$xmlData = <<<XML
<note>
<to>User</to>
<from>Admin</from>
<message>訪問してください http://m66.net</message>
</note>
XML;
$xml = simplexml_load_string($xmlData);
echo "受信者: " . $xml->to . "\n";
echo "送信者: " . $xml->from . "\n";
echo "情報: " . $xml->message . "\n";
特性 | xml_parse() | Simplexml_load_string() |
---|---|---|
分析方法 | イベント駆動型(サックス) | オブジェクトベース(dom) |
メモリの使用 | 少ない(大規模な文書に適している) | 詳細(XML全体がメモリにロードされます) |
使いやすさ | より複雑なカスタムコールバック関数が必要です | アレイ/オブジェクトアクセスと同様に、シンプルで直感的です |
スケーラビリティ | 柔軟ですが複雑です | シンプルだが限られたスケーラビリティ |
エラー処理 | 手動の判断誤差 | より良い内蔵処理 |
サポートされているPHPバージョン | PHP 4以上 | PHP 5以上 |
アドバンテージ:
メモリが少なく、大きなXMLファイルの解析に適しています。
より根本的で柔軟で、XMLコンテンツの細かい制御が可能になります。
RSSストリーミングやログファイルなど、データ処理のストリーミングにより適しています。
欠点:
エンコードは複雑で、複数のコールバック関数の定義が必要です。
初心者や読みやすさが悪いことには友好的ではありません。
開発効率の低さと困難なデバッグ。
アドバンテージ:
使いやすく、構文をクリアし、簡単に開発しやすい。
XPathクエリをサポートして、データ抽出機能を強化します。
中小規模のXMLファイルと適切に構造化されたデータに適しています。
欠点:
ドキュメント全体を解析すると、多くのメモリが得られます。
例外的なXML構造に対する弱い断層トレランス。
超大部分または動的ストリーミングXMLデータの処理には適していません。
大規模なXMLファイルを扱っている場合、またはラインごとにデータを処理する必要がある場合は、 xml_parse()を使用することをお勧めします。
XMLデータ構造が単純で、データボリュームが大きくない場合、 Simplexml_load_string()を使用すると、開発効率を大幅に改善できます。
関連タグ:
xml_parse