Редактируйте XML с CDATA, используя SimpleXMLElement

Я видел много вопросов с хорошими ответами о том, как загрузить XML-строку с CDATA или как написать элемент с содержимым CDATA, но я не смог найти способ отредактировать XML, который уже содержит CDATA и сохранить эти предыдущие CDATA после использования $xml->asXML(),

Есть ли способ отредактировать XML, который уже содержит CDATA и сохранить те предыдущие CDATA после использования $xml->asXML() ?

Посмотрите на этот сценарий:

<?php
$str_xml = "<myxml><mytag><![CDATA[In this content, 8 > 2 & 1 < 9, and 10 is a 10% of 100. ]]></mytag></myxml>";

try {
echo "XML with CDATA: \n\n";
$xml = simplexml_load_string($str_xml, null, LIBXML_NOCDATA);
echo $xml->asXML() ."\n\n";
} catch(Exception $e){
echo "XML with CDATA: \n\n";
echo $e->getMessage() ."\n\n";
}
?>

После запуска этого примера вывод:

<?xml version="1.0"?>
<myxml><mytag>In this content, 8 &gt; 2 &amp; 1 &lt; 9, and 10 is a 10% of 100. </mytag></myxml>

Как видите, эта выходная строка XML больше не имеет значений тега CDATA. Не преминет загрузить другой simplexml_load_string с этим выводом, но существующие теги CDATA пропадают, а также специальные символы заменяются соответствующими им HTML-сущностями.

Мне нужно знать, есть ли способ прочитать какой-либо XML, содержащий любой количество значений узла CDATA, и что после использования $xml->asXML()выходная строка по-прежнему содержит предыдущие значения тега CDATA.

Спасибо за помощь.

0

Решение

Выписанный XML не содержит узлов CDATA, потому что вы сказали SimpleXML избавиться от них при прохождении LIBXML_NOCDATA, Чтобы оставить их, просто не передавайте эту опцию!

Вот живая демонстрация исправленной версии, как показано ниже:

<?php
$str_xml = "<myxml><mytag><![CDATA[In this content, 8 > 2 & 1 < 9, and 10 is a 10% of 100. ]]></mytag></myxml>";

try {
echo "XML with CDATA: \n\n";
$xml = simplexml_load_string($str_xml);
echo $xml->asXML() ."\n\n";
} catch(Exception $e){
echo "XML with CDATA: \n\n";
echo $e->getMessage() ."\n\n";
}

Все прочитанные вами ответы и комментарии о том, что вам нужно передать эту опцию, чтобы использовать узлы CDATA с SimpleXML, довольно просты. неправильно. Единственная проблема заключается в том, что выход print_r, var_dumpи т. д. не дает полного представления данных, доступных SimpleXML; это не значит, что его там нет.

Чтобы получить доступ к тексту в вашем примере XML, вам просто нужно привести элемент к строке (некоторые контексты, такие как echo Скажите, сделайте это автоматически). Как в этот пример:

$xml = simplexml_load_string($str_xml);
$tag_content = (string)$xml->mytag;
echo "Here is the content of the <mytag> node: $tag_content";
2

Другие решения

Других решений пока нет …