我有一个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>
答案 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);
}