Как создать CDATA

  • Автор темы CrazyHacKeRs
  • Дата начала

CrazyHacKeRs

Guest
Как создать CDATA

Нужно значение заключить в CDATA, и вставить в какой-нибудь нод. Какое решение может быть?
 

olpa

Новичок
Вставить строку текста (1) XXXCDATA__SHOULD_BE_HEREXXX, сериализовать дерево и заменить (1) на секцию CDATA.
 

CrazyHacKeRs

Guest
Ничего не понял :) Можно примерчиком?
 

cryo

Guest
PHP:
if ($xml=domxml_new_doc('1.0')) {
 $elem=$xml->create_element('element');
 $xml->append_child($elem);
 $cdata = $xml->create_cdata_section('cdata text 12345');
 $elem->append_child($cdata);
}
 

CrazyHacKeRs

Guest
Помоги пжл, бьюсь и ничего не получается :(

Fatal error: Call to undefined function: create_cdata_section() in


У меня есть такая функция:
PHP:
function make_node($parent, $name, $content)
      {
      $parent ->new_child(iconv('windows-1251', 'UTF-8',$name), iconv('windows-1251', 'UTF-8', str2xml($content)));
      return $parent->last_child();
      }
в которую я передаю нод куда вставить, название, значение.

Как ее подправить чтоб возвращала CDATA внутри нода.

Попробывал так:
PHP:
function make_cdata($parent, $name, $content)
{
     $new   = $parent ->new_child(iconv('windows-1251', 'UTF-8',$name), "");
     $cdata = $parent->create_cdata_section($content);



     $new->append_child($cdata);
     return $parent->last_child();
}
ничего не получилось

Спасибо
 

Witaliy

Guest
Попробуй так, судя по php manual'у

create_cdata_section - это функция класса DOMDocument а не DOMNode.

function make_cdata($parent, $name, $content)
{
$new = $parent ->new_child(iconv('windows-1251', 'UTF-8',$name), "");
$xmlDoc = $parent->owner_document();
$cdata = $xmlDoc->create_cdata_section($content);
$new->append_child($cdata);
return $parent->last_child();
}
 

CrazyHacKeRs

Guest
Получилось, только вот теперь на преобразованиях ругается:

Warning: Sablotron error on line 6: XML parser error 4: not well-formed (invalid token) in /var/www/domain/xxx/xxx.php on line 1033

Может хитрым способом надо CDATA расскрывать?

Сейчас:
PHP:
<xsl:template match="DESCRIPTION" mode="main" >
		<xsl:value-of select="."  disable-output-escaping="yes"/>
	</xsl:template>
И главное, xmlspy все хорошо делает :(

Как комментирую вызов функции с CDATA, остальное нормально начинает отображаться:

В xml вроде все красиво:

PHP:
<DESCRIPTION><![CDATA[xxx xxx ит д]]></DESCRIPTION>
 

chameleon

Новичок
Может хитрым способом надо CDATA расскрывать?
xslt-процессор, имхо, ни о каких-таких CDATA и знать не знает...

disable-output-escaping="yes"
а вот этой ш...тукой очень не рекомендовано пользоваться...

Как комментирую вызов функции с CDATA, остальное нормально начинает отображаться:
1. что сие значит? т.е. если CDATA-узлы не включаются в исходный XML, то все ОК? надо думать...
2. какой тип контента пытаетесь вставлять в CDATA и выводить потом с DOE="yes"?

имхо, у вас ошибка не в исходном, а в результирующем дереве.
<xsl:eek:utput method="какой?"/>
 

CrazyHacKeRs

Guest
Originally posted by chameleon

а вот этой ш...тукой очень не рекомендовано пользоваться...

Почему????? Насколько мне известно, это вполне нормальная директива.




Задача простая.

Для примера (чтоб представить), выборка из таблички где каждое поле оформляется в виде тега, после чего накладываться xslt шаблон.

Раньше это все работало.

Теперь понадобилось помимо простой информации, иметь возможность вставки html кода для оформления.


Для того чтоб это сделать, как я понимаю информацию необходимо теперь оформлять в виде CDATA секции.


И как только в формированном мною xml файле(теге) появлется CDATA, программу начинает плющить...

Комментирую строчку в php коде, который создает этот тег - опять все работает.


В пхп ошибка ссылается на функцию преобразования, так что ничем она мне не помогает.


xml вполне валидный.

Есть предположение что символ какой-нибудь проскаивает котрый необходимо объявит как inity, но...
 

chameleon

Новичок
Почему????? Насколько мне известно, это вполне нормальная директива.
Да вот не совсем (An XSLT processor is not required to support disabling output escaping).
xml вполне валидный.
А Саблот Вам говорит что не well-formed :)..и еще раз: не исходное дерево, а РЕЗУЛЬТИРУЮЩЕЕ. Самый простой вариант - вы выводите содержимое CDATA в результирующее дерево с doe="yes", HTML внутри CDATA это Вам не XML (опять же в xsl:eek:utput что?)
 

CrazyHacKeRs

Guest
Я думаю действительно все дело в них

Сделал простой код:
PHP:
 make_cdata($xmlMainInfoDataNode, "DESCRIPTION","<h1>aaa</h1>");
Отобразился :)

Скорее всего информация из БД содержит специальные символы, с которыми сейчас придется бороться.

Спасибо.

PS кстати, если отключить doe, то на экране так и напишется <h1>aaa</h1>, вместо раскрытия в заголовок....
Поэтому я так и не пойму, почему предлагаешь не использовать
 

chameleon

Новичок
то на экране так и напишется <h1>aaa</h1>
естессно, в коде-то будет &lt;h1&gt;aaa...
у меня была схожая проблема. Решил так:
перед тем как записать в базу некий html, обрабатываю его tidy и в базу кладу уже правильный xml, ктороый потом можно выводить вообще без CDATA и, кроме того, еще и шаблоны на отдельные элементы написать...
 
Сверху