Редактирование xml-файла с помощью CDATA


Я редактирую xml-файл, используя этот код

$xml = simplexml_load_file($xmlfile) or die ("Unable to load XML file!"); 
$event->title = $newtitle;
$event->description = $newdescription;
file_put_contents($xmlfile, $xml->asXML());

Я хочу добавить CDATA в описание.Я использовал этот код

$event->description = '<![CDATA['.$newdescription.']]>';

Но в xml < и > преобразуются как &lt; и &gt;.Как я могу сохранить CDATA таким, какой он есть.Есть любой другой метод редактирования.Заранее спасибо.

На самом деле я хочу отредактировать этот xml-файл

<events date="06-11-2010">
    <event id="8">
      <title>Proin porttitor sollicitudin augue</title>
      <description><![CDATA[Lorem  nunc.]]></description>
    </event>
  </events>
  <events date="16-11-2010">
    <event id="4">
      <title>uis aliquam dapibus</title>
      <description><![CDATA[consequat vel, pulvinar.</createCDATASection></description>
    </event>
  <event id="1"><title>You can use HTML and CSS</title>
  <description><![CDATA[Lorem ipsum dolor sit amet]]></description></event></events>

С идентификатором

Author: Warrior, 2010-11-05

3 answers

Я думаю, что вам нужно использовать 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);
 3
Author: Cez, 2010-11-05 11:04:16

По сути, SimpleXML экранирует все значения для использования XML, поэтому многих причин для использования узлов CDATA нет. Однако, если они вам действительно нужны, это невозможно сделать в SimpleXML, используйте другую альтернативу, такую как DOMDocument, и это функция createCDATASection()

 2
Author: Wrikken, 2010-11-05 09:15:35

Попробуйте

$xml = simplexml_load_file($xmlfile,'SimpleXMLElement', LIBXML_NOCDATA);

?

 -2
Author: MatTheCat, 2010-11-05 08:59:26