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