Редактирование 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 <
и >
преобразуются как <
и >
.Как я могу сохранить 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 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);
По сути, SimpleXML
экранирует все значения для использования XML, поэтому многих причин для использования узлов CDATA
нет. Однако, если они вам действительно нужны, это невозможно сделать в SimpleXML
, используйте другую альтернативу, такую как DOMDocument
, и это функция createCDATASection()
Попробуйте
$xml = simplexml_load_file($xmlfile,'SimpleXMLElement', LIBXML_NOCDATA);
?