DOMDocument保存XML CDATA

时间:2016-06-01 16:38:26

标签: php xml

我有一个xml文件,其中包含

形式的元素
<TEST id="messageId"><![CDATA[Text I want to manipulate]]></TEST>

我可以使用下面的代码访问CDATA中的文本

$dom = new DOMDocument;
$dom->Load('/path/to/file.xml');

foreach ($dom->getElementsByTagName('TEST') as $element) {

    $value = $element->nodeValue; //Text I want to manipulate

    // do stuff to $value

    $element->nodeValue = $value; // issue
}

$dom->save('/path/to/different/file.xml');

然而,当保存xml文件时,CDATA丢失了,我得到了

<TEST id="messageId">Manipulated text</TEST>

我已经阅读过我需要使用createCDATASection()但我无法弄清楚如何在这种情况下使用它。如果我将$element->nodeValue = $value替换为$dom->createCDATASection($value),那么我只会保存原始未修改的XML文件。

我想恢复原始格式,但使用操作文本

<TEST id="messageId"><![CDATA[Manipulated text]]></TEST>

2 个答案:

答案 0 :(得分:1)

可以通过下一个代码完成

foreach ($dom->getElementsByTagName('TEST') as $element) {
    $value = $element->nodeValue; //Text I want to manipulate
    // do stuff to $value
    $new = $dom->createCDATASection($value);
    $element->parentNode->replaceChild($new, $element);
}

 echo $dom->saveXML();

但是在删除当前元素后foreach将会中断。如果您想处理一些TEST标签,请写下:

$tests = $dom->getElementsByTagName('TEST');
$ln = $tests->length;
for($i = 0; $i < $ln; $i++) {
    $element = $tests->item(0);
    $value = $element->nodeValue; //Text I want to manipulate
    // do stuff to $value
    $new = $dom->createCDATASection($value);
    $element->parentNode->replaceChild($new, $element);
}

 echo $dom->saveXML();

答案 1 :(得分:1)

您需要将新的CDATA节点附加到文档中。 From the docs

  

此函数创建类DOMCDATASection的新实例。 除非与(例如)DOMNode :: appendChild()一起插入,否则此节点不会显示在文档中。

试试这段代码:

foreach ($dom->getElementsByTagName('TEST') as $element) {

    $value = $element->nodeValue;

    // do stuff to $value

    $element->removeChild($element->firstChild);

    $cdata = $dom->createCDATASection($value);
    $element->appendChild($cdata);
}