2016-06-01 7 views
0

У меня есть файл XML с элементами в видеDOMDocument сохранение XML CDATA

<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(), но я не могу совсем Figur e, как использовать его в этом контексте. Если я заменил $element->nodeValue = $value на $dom->createCDATASection($value), тогда я просто сохраню исходный неизмененный XML-файл.

Я хочу, чтобы вернуться к исходному формату, но с манипулируют текстом

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

ответ

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); 
} 
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(); 

Но Еогеасп сломается после удаления текущего элемента. Если вы хотите обработать некоторые теги 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(); 
Смежные вопросы