使用CDATA编辑xml文件

时间:2010-11-05 08:50:33

标签: php xml editing

我正在使用此代码编辑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>

带id

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:2)

基本上,SimpleXML将转义XML使用的所有值,因此使用CDATA节点的许多原因都不存在。但是,如果您确实需要它们,则无法在SimpleXML中完成,请使用其他替代方法,例如DOMDocument,它的功能为createCDATASection()

答案 2 :(得分:-2)

尝试

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