Я думаю, что вам нужно использовать DOM , когда ваши потребности более сложны и больше не простые .Есть метод createCDATASection .
Вот базовый пример:
$dom=new DOMDocument();
$xml='data.xml';
$dom->load($xml);
$cdata=$dom->createCDATASection('<p>Foo</p>');
foreach ($dom->getElementsByTagName('item') as $item) {
$item->getElementsByTagName('content')->item(0)->appendChild($cdata);
}
$dom->save($xml);
XML, который идет с этим:
<?xml version="1.0" encoding="utf-8"?>
<data>
<item>
<title>Test</title>
<content><![CDATA[<p>Foo</p>]]></content>
</item>
</data>
Что касается вашего примера и комментария, вам должно помочь следующее:
$dom=new DOMDocument();
$dom->validateOnParse = true;
$xml='data.xml';
$dom->load($xml);
// Unless the ID attribute is recognised
foreach ($dom->getElementsByTagName('event') as $event) {
$event->setIdAttribute('id', true);
}
$event = $dom->getElementById("1");
foreach ($event->getElementsByTagName('description') as $description) {
$cdata=$dom->createCDATASection('<p>'. $description->nodeValue .'</p>');
$description->replaceChild($cdata, $description->childNodes->item(0));
}
$dom->save($xml);