Редактирование XML-файла с CDATA - PullRequest
2 голосов
/ 05 ноября 2010

Я редактирую 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>

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

Ответы [ 3 ]

3 голосов
/ 05 ноября 2010

Я думаю, что вам нужно использовать 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);
2 голосов
/ 05 ноября 2010

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

0 голосов
/ 05 ноября 2010

Попробуйте

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

...