Смешивание childs с cdata под одним узлом. Это действительно? - PullRequest
1 голос
/ 17 ноября 2009

Мне нужно проанализировать следующий XML-документ (поступающий из внешнего веб-сервиса):

...
<dati>
    <Riconoscimento>
        <IdentificativoPosizione>xxxx</IdentificativoPosizione>
        <OutputRestituiti>xxx</OutputRestituiti>
    </Riconoscimento>
    <![CDATA[text text text]]>
</dati>    
...

Проблема в том, что до тех пор, пока не появится узел "Riconoscimento", синтаксический анализатор simplexml не сможет прочитать раздел cdata, если я удалю этот дочерний элемент, все будет работать без проблем.

Итак, главный вопрос: это действительный документ XML, и если он действителен, есть ли какой-нибудь способ получить доступ к разделу CDATA с помощью php, не удаляя лишних потомков вручную?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 17 ноября 2009

Прежде всего: это действительный документ XML (см. здесь ).

Определение: CDATA разделы могут возникнуть где угодно могут появиться данные персонажа; они используются для экранирования блоков текста содержащие символы, которые в противном случае быть признанным как разметка. Разделы CDATA начинаются со строки <![CDATA[ "и конец строкой" ]]> ":

В вашем случае <data/> -элемент является элементом со смешанным содержимым.

$xmlString = <<<XML
<dati>
    <Riconoscimento>
        <IdentificativoPosizione>xxxx</IdentificativoPosizione>
        <OutputRestituiti>xxx</OutputRestituiti>
    </Riconoscimento>
    <![CDATA[text text text]]>
</dati>
XML;
$xml = simplexml_load_string($xmlString);
var_dump((string)$xml);

/*
 * outputs:
 * string(37) "
 *
 *        text text text
 *    "
 */

(нет необходимости проходить LIBXML_NOCDATA)

1 голос
/ 17 ноября 2009

Вы можете получить это так:

$x = simplexml_load_string('<root><dati>
    <Riconoscimento>
        <IdentificativoPosizione>xxxx</IdentificativoPosizione>
        <OutputRestituiti>xxx</OutputRestituiti>
    </Riconoscimento>
    <![CDATA[text text text]]>
</dati></root>', 'SimpleXMLElement', LIBXML_NOCDATA);

var_dump((string)$x->dati);

Обратите внимание на параметр LIBXML_NOCDATA для преобразования CDATA в текстовый узел.

...