Сергей К.
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("&lt;!]&gt;","]]>",$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 на выходе получится? Будет ли он валидным?
Сергей К.
1649 повідомлень
#14 років тому
Хм. Это не предусмотрено.