2012-02-23 2 views
0

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

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

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

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

ответ

2

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

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

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

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

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

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

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

Смежные вопросы