Intereting Posts
Хорошая практика по внедрению элементов с состоянием в форме Zend MySQL php Линейная интерполяция таблицы Отключить проверку сертификата в PHP SoapClient PHP Переписать URL и сохранить опубликованные данные Запрос списка многодневных событий, происходящих между сегодня и одной неделей с сегодняшнего дня, в зависимости от даты начала и окончания как оптимизировать mysql-запрос, если у меня слишком много операторов OR в моем запросе? Как вставить массив данных в mysql, используя php Как получить пользовательские параметры программно в Magento Разбирайте текст для хэштегов и замените ссылки на php Два разных макета для гостевого пользователя и вошли в систему User-Yii2 в среде Openshift, как получить доступ к базе данных в другом приложении? У меня есть 2 даты в PHP, как я могу запустить цикл foreach, чтобы пройти через все эти дни? PHP private const oAuth в PHP сделать запрос с двумя ногами Состояние переключателя обновления php в db

SimpleXML сохраняет возвращаемый контент на элементе CDATA

Итак, еще один вопрос о возвращении содержимого 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.

Вот мой код:

 $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 '</pre>'; 

Мое эхо возвращает: контент

хотя я вижу содержимое в 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 ) ) ) ) ) ) 

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

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

 $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'); 

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

 $element->NewsComponent->ContentItem->DataContent->body->{'body.content'}; 

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

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

с строковым «контентом» – вероятно, PHP жалуется, что нет постоянной с содержимым имени и поэтому предполагает, что вы имели в виду «контент».

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

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