2010-11-05 2 views
2

я редактирую файл XML с помощью этого кодаРедактирование XML-файл с CDATA

$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 в description.I использовал этот код

$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

Я думаю, что вам нужно использовать 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); 
+0

спасибо Cez.I отредактировал мой вопрос. Я хочу отредактировать содержимое с соответствующим id.Can u tell how is it? – Warrior

+0

@THOmas: Я добавил пример, основанный на вашем XML. Надеюсь, он должен указать вам в правильном направлении. – Cez

+0

- это их способ связывания с xpath и xquery или dom_import_simplexml – Warrior

-2

Попробуйте

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

?

+3

-1 Вы попробовали это? Это не решит проблему – Cez

2

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

+0

+1 Вы избили меня до тех пор, пока я получал ссылки :) – Cez

+0

Erm, несмотря на то, что у вас есть 2 ссылки вместо 1, вы были на несколько секунд раньше я верю ... – Wrikken

+0

@Wrikken: дефицит сна означает, что я не могу сказать время. Получаю ли я верх для усталости? – Cez