SimpleXML продолжает возвращать содержимое элемента CDATA - PullRequest
0 голосов
/ 24 февраля 2012

Итак, еще один вопрос о возврате контента CDATA. Я видел много ответов, но, хотя я пробовал их все, я все равно получаю только контент.

Более подробно:

У меня есть XML-файл (содержащий много NewsItem внутри):

<NewsML>
<NewsItem>    
    <NewsComponent>               
        <ContentItem>                      
            <DataContent>                
                <body>                    
                    <body.content>                        
                        <![CDATA[<p>This is what I am trying to retrieve</p>]]>
                    </body.content>
                </body>
            </DataContent>
        </ContentItem>
    </NewsComponent>
</NewsItem>

Я пытаюсь получить содержимое body.content.

Вот мой код:

<code>$xml = simplexml_load_file('path/to/my/xml.xml',null,LIBXML_NOCDATA);

if(count($xml->children()) > 0){
    foreach($xml->children() as $element){
        $description = (string)$element->NewsComponent->ContentItem->DataContent->body->body.content;
        echo $description;
    }
}
echo '<pre>';
print_r($xml);
echo '
';

Мое эхо возвращается: содержание

хотя я вижу содержимое в print_r моего xml, как мы можем видеть здесь:

SimpleXMLElement Object
(
    [NewsItem] => Array
    (
        [0] => SimpleXMLElement Object
            (

                [NewsComponent] => SimpleXMLElement Object
                    (                            

                        [ContentItem] => Array
                            (
                                [0] => SimpleXMLElement Object
                                    (

                                        [DataContent] => SimpleXMLElement Object
                                            (
                                                [body] => SimpleXMLElement Object
                                                    (
                                                        [body.content] => This is what I am trying to retieve

                                                    )

                                            )

                                    )

                            )

                    )

            )

Я пытался использовать (строку) или нет на элементе.

Я также пытался использовать

$xml = simplexml_load_file('path/to/my/xml.xml',null,LIBXML_NOCDATA);
vs
$xml = simplexml_load_file('path/to/my/xml.xml',"SimpleXMLElement",LIBXML_NOCDATA);
vs
$xml = simplexml_load_file('path/to/my/xml.xml');

Ответы [ 2 ]

2 голосов
/ 24 февраля 2012

Для имен элементов, которые не могут быть идентификаторами PHP (например, body.content), необходимо использовать альтернативную нотацию PHP:

$element->NewsComponent->ContentItem->DataContent->body->{'body.content'};
1 голос
/ 24 февраля 2012

Я думаю, что ваш пример возвращает 'content', потому что вы объединяете элемент, который не существует

$element->NewsComponent->ContentItem->DataContent->body->body

со строкой 'content' - возможно, PHP жалуется на отсутствие константы с именем content и поэтому предполагает, что вы имели ввиду 'content'.

Таким образом, я думаю, вам нужно найти другой способ выбрать элемент с точкой в ​​имени.

(Эта проблема не связана с CDATA.)

...