PHPでXMLを処理する多くの方法があります。その中には、 XML_Parseは、XML構造のコントロールニーズが強い開発者に適した根本的な機能です。この記事では、 XML_PARSE関数を使用してCDATA領域を含むXMLドキュメントを解析する方法について説明します。
xmlでは、 <![cdata [...]]>は、その中の内容をXML構文として解析してはならないことをパーサーに伝えるために使用される指令です。これは、HTMLやスクリプトコードなどの特殊文字を含むコンテンツに非常に便利です。
例:
<note>
<to>Tom</to>
<message><![CDATA[Hello <b>Tom</b>, welcome to <a href="https://m66.net">our site</a>!]]></message>
</note>
XML_PARSEは、XMLラインごとに解析するためのPHPの関数です。それを使用してCDATA領域を解析するには、通常、 xml_parser_create()とカスタムプロセッサ機能を使用する必要があります。
$parser = xml_parser_create();
スタートタグ、エンドタグ、および文字データプロセッサの3つのプロセッサ関数を登録する必要があります。
$data = [];
function startElement($parser, $name, $attrs) {
global $data;
$data['current'] = $name;
}
function endElement($parser, $name) {
global $data;
$data['current'] = null;
}
function characterData($parser, $value) {
global $data;
if (!isset($data['values'][$data['current']])) {
$data['values'][$data['current']] = '';
}
$data['values'][$data['current']] .= $value;
}
xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");
$xml = <<<XML
<note>
<to>Tom</to>
<message><![CDATA[Hello <b>Tom</b>, welcome to <a href="https://m66.net">our site</a>!]]></message>
</note>
XML;
if (!xml_parse($parser, $xml, true)) {
die(sprintf("XML Error: %s at line %d",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)));
}
xml_parser_free($parser);
print_r($data['values']);
出力は次のとおりです。
Array
(
[TO] => Tom
[MESSAGE] => Hello <b>Tom</b>, welcome to <a href="https://m66.net">our site</a>!
)
注:すべてのタグ名は大文字に変換されます。
XML_PARSEは、複雑なまたは大容量XMLデータの処理に適したイベント駆動型XML解析方法です。 CDATAが含まれている場合は、その内容を正常にキャプチャするためにCharacherDataプロセッサをセットアップするだけです。 DOMやSimplexMLよりも使用する方が複雑ですが、パフォーマンスと柔軟性にはいくつかの利点があります。
プロジェクトが高い解析効率を必要とする場合、またはXMLのイベントの処理をカスタマイズする必要がある場合、 XML_PARSEが適しています。