読者です 読者をやめる 読者になる 読者になる

PHPのSimpleXMLにてCDATAがあるXMLをロードする場合について

$xml = simplexml_load_string($s, 'SimpleXMLElement', LIBXML_NOCDATA);

とするとインスタンス内でCDATAを文字列として扱ってくれているが、SimpleXMLElement#asXML()で出力するとentity変換してくれる。CDATAでなく文字列として扱ってくれるためだろう。

$xml = simplexml_load_string($s, 'SimpleXMLElement');

とするとインスタンス内では文字列として扱ってくれない(var_dump()で見ると該当部分はSimpleXMLElementのオブジェクトだが空)。だが、SimpleXMLElement#asXML()では元のとおり出力してくれる。

<?php
$s = <<<_EOF
<?xml version="1.0" encoding="UTF-8" ?>
<faq>
  <data>
    <no>番号</no>
    <title>タイトル</title>
    <question>質問</question>
    <answer>回答</answer>
    <flag>フラグ</flag>
  </data>
  <data>
    <no>1</no>
    <title>テストついて</title>
    <question><![CDATA[あいうえお
かきくけこ
<div id="test">
  <p class="notice">テスト</p>
</div>
さしすせそ]]></question>
    <answer><![CDATA[アイウエオ
カキクケコ
サシスセソ]]></answer>
    <flag>0</flag>
  </data>
</faq>
_EOF;

//$xml = simplexml_load_string($s, 'SimpleXMLElement', LIBXML_NOCDATA);
$xml = simplexml_load_string($s, 'SimpleXMLElement');
var_dump($xml);

print $xml->asXML();
?>