PHPでSimpleXMLでCDATAを追加

SimpleXMLはPHP5で標準のXMLを扱うクラス。SimpleXMLElement#addChild()で要素を追加するが、CDATAを追加したい場合は標準ではできないようだ。
そこで、PHPのマニュアル中の例(以下参照)を参考に動作を確認。

http://www.php.net/manual/ja/simplexmlelement.addChild.php

  • SimpleXMLElementクラスを継承
  • DOMElementを取得して、CDATAをDOMElement#appendChild()する。
/**
 * SimpleXMLExtended class
 *
 * This class extend due to add CDATA.
 * refers to http://www.php.net/manual/ja/simplexmlelement.addChild.php
 */
class SimpleXMLExtended extends SimpleXMLElement
{
        public function addCData($cdata_text) {
                $node= dom_import_simplexml($this);
                $no = $node->ownerDocument;
                $node->appendChild($no->createCDATASection($cdata_text));
        }
}

$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, 'SimpleXMLExtended', LIBXML_NOCDATA);
$xml = simplexml_load_string($s, 'SimpleXMLExtended');

$data = $xml->addChild('data');
$data->addChild('no', '2');
$data->addChild('title', '追加タイトルテスト');
$question = $data->addChild('question');
$question->addCData('質問内容文字列<em>CDATA</em>');
$answer = $data->addChild('answer');
$answer->addCData('回答内容文字列<em>CDATA</em>');
$data->addChild('flag', '1');

print $xml->asXML();