Я видел много вопросов с хорошими ответами о том, как загрузить 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 > 2 & 1 < 9, and 10 is a 10% of 100. </mytag></myxml>
Как видите, эта выходная строка XML больше не имеет значений тега CDATA. Не преминет загрузить другой simplexml_load_string
с этим выводом, но существующие теги CDATA пропадают, а также специальные символы заменяются соответствующими им HTML-сущностями.
Мне нужно знать, есть ли способ прочитать какой-либо XML, содержащий любой количество значений узла CDATA, и что после использования $xml->asXML()
выходная строка по-прежнему содержит предыдущие значения тега CDATA.
Спасибо за помощь.
Выписанный 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";
Других решений пока нет …