CDATA и как с ним броться

Kivsiak

Новичок
CDATA и как с ним броться

Доброго времени суток, я столкнулся с тем что непонимаю что происходит
PHP:
<?php
$xmlpath = dirname(__FILE__);
$xmldoc = domxml_open_file( $xmlpath. "\\in.xml");
$xmldoc->dump_file($xmlpath."\\out.xml",false,true);
?>
, где in.xml:

<?xml version="1.0" encoding="UTF-8"?>
<root>
<cdatanode><![CDATA[
And thisis cdata <cdata>
]]>
</cdatanode>
<textnode>
Here'is a text
</textnode>
</root>

В оut.xmk ожидаю тогоже, но получаю
<?xml version="1.0" encoding="UTF-8"?>
<root>
<cdatanode>
And thisis cdata &lt;cdata&gt;

</cdatanode>
<textnode>
Here'is a text
</textnode>
</root>

т.е. CDATA убивается напрочь. Как с этим можно бороться, кроме ручного добавления CDATA узлов?

wxp(sp1), apache 1.31 php 4.3.9

-~{}~ 07.02.05 21:57:

[20 Oct 2004 8:02am CEST] [email protected]

technically there's is no difference between a text and
a cdata section. CDATA is just another way to write text
nodes. Internally it's the same (AFAIK).

We won't fix that.

Уроды блин Ж(
 

slach

Новичок
ну... это сионисткий заговор =) CDATA считается идеологически НЕПРАВИЛЬНЫМ =)
так что... придеца тебе терпеть =)
 

neko

tеam neko
причем здесь заговор и уроды
cdata существует только в тексте
в дереве никакой сидаты нету

это просто шортхенд чтобы проще было писать
 

Kivsiak

Новичок
php
2neko:
"cdata существует только в тексте" что ты имеешь ввиду?

-~{}~ 08.02.05 14:58:

This change was necessary as libxml 2.6 broke a bunch of domxml's xsl
stuff. This would require an API change to be able to support loading
CDATA. domxml behavior when using libxml 2.6+ and loading a document now
converts incoming CDATA to TEXT nodes. This does not affect creating
CDATA manually however.

Мда. Делать нечего придется ручками. Хотя в PHP5 работает как полагается Ж(
 

neko

tеam neko
я имею в виду буквально следующее:

написать:
Код:
<![CDATA[
And thisis cdata <cdata>
]]>
это абсолютно тоже самое что написать:

Код:
 And thisis cdata &lt;cdata&gt;
цель сидаты
облегчить человеку работу по написанию xml документа
никакого другого смысла в данную конструкцию не вкладывали

для парсера это просто индикатор того, что это текст для а не разметка.

-~{}~ 08.02.05 15:07:

"cdata существует только в тексте" что ты имеешь ввиду?
сdata не создает элементов в дереве
вообще никаких
 

Kivsiak

Новичок
Согласен, но проблема в том что я храню в cdata-контейнере скрипт для которго "<" и "&lt" не одно и тоже.
В любом случае я получил ответ котрый меня удоволетворил. Спасибо
 

slach

Новичок
да ты что ну надо же =))

а как же
DOMDocument->createCDATASection
???
и далее в дереве есть NODE TYPE
XML_CDATA_SECTION_NODE

?

-~{}~ 09.02.05 10:13:

хотя это php5 DOM а не php4 DOMXML
 

neko

tеam neko
слеш....
во-первых это действительно node, но никак не элемент
например текст в документе это тоже node
я думаю, дальше объяснять ненадо :Р

во-вторых нету никакого php5 dom
есть DOM Level 1,2,3
и к пхп он имеет не больше отношения чем к ассемблеру
 

Kivsiak

Новичок
Сорри, но как я понимаю. DOM это не более чем спецификация для парсера. Т.е. те классы что я использую в пхп яве дельфи должны вести одинково. Например в jscripte реализация почти полностью соответвует рекомендациям php4 не очень сторго придерживается, php5 же более строг в этом отношении.
В любом случае работа c CDATA определена в спецификациях как XML так и DOM.
И несмотря на то что некоректная обработа CDATA не особо напрягает, по стандарту она должна быть.
 

neko

tеam neko
че еще там тебе некорректно?
я еще раз говорою, нода с сидатой, это тоже практически самое что нода с текстом...
 

chameleon

Новичок
только вот текст в CDATA не анализируется и, ессно, на место &amp;#160; например пробел не подставится, в отличии от ноды с текстом.
 

slach

Новичок
во-первых XML_CDATA_SECTION_NODE это действительно node, но никак не элемент
например текст в документе это тоже node
я думаю, дальше объяснять ненадо :Р
вообще то было бы не плохо объяснить, а то я чего то уже савсем мозг поломал глядя в спецификацию DOM

моя позиция
1) createCDATANode - позволяет создать CDATA ноду в содержимое которой засунуть < и >

2) почему тогда при сериализации в строку эти данные обязательно приводятся в safe вид ? тыкните в спецификацию, по идее там правила сериализации для CDATA должны быть заданы, только где оно я не могу пока найти =(
 

neko

tеam neko
http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html#ID-667469212
http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html#ID-FF21A306
http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html#ID-1312295772

мне кажется ты просто непонял что такое DOM
DOM, это прежде все интерфейс для манипуляции с деревом, который может быть реализован в каком-то языке
и большая часть вопрос связанных с сериализацией по понятным причинам является implementation dependent

для примера:
у XSLT процессоров там вон вообще, способность сериализовать дерево не является обязательной ;-)
 
Сверху