SimpleXML CDATA
1649 повідомлень
#14 років тому
Кто знает как можно добавить или изменить значение типа CDATA для узла с помощью SimpleXML.Заранее спасибо.
3240 повідомлень
#14 років тому
Увы, SimpleXML — на то он и "simple", что может очень мало, в том числе он не предназначен для формирования блоков CDATA...Для таких целей рекомендуется использовать DOM.
Ниже я привел пример, как комбинировать SimpleXML с DOM, хотя это уже немного извращение, так как если нужна более продвинутая работа с XML, то лучше уж было бы полностью отказаться от SimpleXML... ну да ладно.
<?php
$inputxml = '<?xml version="1.0"?><xml><test></test></xml>';
$newcdata = 'a > b';
$xml = simplexml_load_string($inputxml);
$dom = dom_import_simplexml($xml->test);
$dom->appendChild($dom->ownerDocument->createCDATASection($newcdata));
echo $xml->asXML();
Данный пример добавляет блок CDATA в test.
1649 повідомлень
#14 років тому
tvv, спасибо.Я поступил еще более извращенно:

$block = $xml->blocks->addChild('block',"<!. "]]>");
....
$xml->asXML("../site.xml");
$f=file_get_contents("../site.xml");
$f=str_replace("<!]>","]]>",$f);
file_put_contents("../site.xml",$f);
Попробую и ваш вариант. Интересно какой быстрее работать будет. Пока ответа ждал нашел решение. Смотрю ни о кого не сладко с этим, а я думаю что только у меня.
3240 повідомлень
#14 років тому
Цитата ("WebDesignStudio"):Попробую и ваш вариант. Интересно какой быстрее работать будет. Пока ответа ждал нашел решение. Смотрю ни о кого не сладко с этим, а я думаю что только у меня.
И не может быть сладко, потому что, как я и писал выше, SimpleXML просто не предназначен для таких задач.
Для продвинутой работы с XML, куда входит и работа с блоками CDATA, уже нужно использовать DOM. Вот там уже все просто и сладко, но приходится немного больше (по сравнению с SimpleXML) платить производительностью и расходом памяти.
Кстати, в Вашем решении есть недостатки:
- Если $_POST содержит символы < > и &, или строку "]]>" и т.д. то блок CDATA будет сформирован Вашим кодом неправильно. Вообще считается, что вручную формировать XML, и в частности блок CDATA — это крайне нехорошее решение.
- Зачем Вы в файл пишите промежуточный результат? Можно же было сразу: $f = $xml->asXML();
- Использовать входные данные (в Вашем случае $_POST) без предварительной фильтрации крайне опрометчиво.
1649 повідомлень
#14 років тому
Цитата:Кстати, в Вашем решении есть недостатки:
- Если $_POST содержит символы < > и &, или строку "]]>" и т.д. то блок CDATA будет сформирован Вашим кодом неправильно. Вообще считается, что вручную формировать XML, и в частности блок CDATA — это крайне нехорошее решение.
- Зачем Вы в файл пишите промежуточный результат? Можно же было сразу: $f = $xml->asXML();
- Использовать входные данные (в Вашем случае $_POST) без предварительной фильтрации крайне опрометчиво.
-проверил и работает нормально
-...
-это еще не готовый вариант. все POST данные у меня фильтруются автоматом

3240 повідомлень
#14 років тому
Цитата ("WebDesignStudio"):-проверил и работает нормально
Точно проверили?
Если в Вашем коде $_POST будет равно "]]>]]>]]>" то какой XML на выходе получится? Будет ли он валидным?