PHPでSimpleXMLでCDATAを追加
SimpleXMLはPHP5で標準のXMLを扱うクラス。SimpleXMLElement#addChild()で要素を追加するが、CDATAを追加したい場合は標準ではできないようだ。
そこで、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();