2014-12-15 3 views
4

Я разбираю XML из источника данных, который мы используем в нашем веб-приложении, и у меня возникают проблемы с доступом к данным из определенной части XML.Как получить доступ к этому числовому элементу в объекте SimpleXML?

Во-первых, вот вывод print_r на то, к чему я пытаюсь получить доступ.

SimpleXMLElement Object 
(
    [0] => 
This is the value I'm trying to get 

) 

Тогда вот XML, который я пытаюсь получить.

<entry>  
    <activity:object> 
     <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type> 
     <id>542</id> 
     <title> 
     Title string is a string 
     </title> 
     <content> 
     This is the value I'm trying to get 
     </content> 
     <link rel="alternate" type="html" href="#"/> 
     <link rel="via" type="text/html" href="#"/> 
    </activity:object> 
</entry> 

Элемент контента - это то, что мне нужно.

Когда я обращаюсь к нему с $post->xpath('activity:object')[0]->content, я заканчиваю тем, что выше.

Я попытался использовать $zero = 0;, а также ->content->{'0'} для доступа к этому элементу, но каждый раз, когда я просто возвращаю пустой объект SimpleXML, как показано ниже.

SimpleXMLElement Object 
(
) 

Есть ли еще один способ получить доступ к этому, которого я еще не нашел?

Спасибо!

ответ

1

Вы просто должны быть в состоянии получить доступ к нему напрямую:

$content = $post->xpath('//content'); 

echo $content[0]; 

С PHP 5.4 или выше, вы могли бы быть в состоянии сделать это сделать:

$content = $post->xpath('//content')[0]; 

Или, если преобразовать XML в строку как @kkhugs говорит, что вы можете использовать

/** 
* substr_delimeters 
* 
* a quickly written, untested function to do some string manipulation for 
* not further dedicated and unspecified things, especially abused for use 
* with XML and from http://stackoverflow.com/a/27487534/367456 
* 
* @param string $string 
* @param string $delimeterLeft 
* @param string $delimeterRight 
* 
* @return bool|string 
*/ 
function substr_delimeters($string, $delimeterLeft, $delimeterRight) 
{ 
    if (empty($string) || empty($delimeterLeft) || empty($delimeterRight)) { 
     return false; 
    } 

    $posLeft = stripos($string, $delimeterLeft); 
    if ($posLeft === false) { 
     return false; 
    } 

    $posLeft += strlen($delimeterLeft); 

    $posRight = stripos($string, $delimeterRight, $posLeft + 1); 
    if ($posRight === false) { 
     return false; 
    } 

    return substr($string, $posLeft, $posRight - $posLeft); 
} 

$content = substr_delimeters($xmlString, "<content>", "</content>"); 
+0

К сожалению, это не сработает. Я просто возвращаю туда пустой объект. Я опубликовал на самом деле просто фрагмент моего более крупного XML-файла (слишком большой для публикации здесь), но есть только один элемент, содержащий элемент «activity: object», поэтому мне нужно получить доступ к этому до «content». Есть ли другой способ доступа к элементам XML с пространствами имен, о которых я не знаю? –

+0

Какое ваше пространство имен перед активностью: объект? – Demodave

+0

Я только что изменил XML в главном сообщении, чтобы отобразить более точное представление о полной строке. Он просто завернут в ''. Вот почему я пытаюсь сначала получить доступ к '' через xpath. –

2

xpath возвращает simpleXMLElement, который имеет функцию преобразования его в строку. Попробуйте эту функцию:

http://php.net/manual/en/simplexmlelement.tostring.php

+0

К сожалению, я просто ошибаюсь, говоря, что я не могу запустить статический метод нестатически. Я действительно надеялся, что это будет так просто! –

0

print_r всегда вводит в заблуждение относительно SimpleXMLElement. Выход у вас есть, например:

Код Ссылка:

$testate = $post->xpath('activity:object')[0]->content; 
print_r($testate); 

Выход:

SimpleXMLElement Object 
(
    [0] => 
This is the value I'm trying to get 

) 

Это не означает, что вам нужно будет получить доступ к тексту, который вы ищете, используя массив индекс 0 ([0]). Ну, на самом деле, хотя это не значит, это не значит, что это невозможно. Я знаю, смущаясь.

Однако вы ищете строковое значение, а не объект (значение). Все, что вам нужно сделать, это отличить до строки:

$testate = $post->xpath('activity:object')[0]->content; 
$text = (string) $testate; 
      ######## 

Важная часть здесь - это действительно отливка в строку.Как print_r уже предложил вам, используя нулевой индекс будет работать, тоже:

$text = (string) $testate[0]; 

Но нулевой индекс просто не нужна и только внутренняя информация.

Просто важно с вами связаться: Не полагайтесь на print_r с SimpleXMLElement. Это объект, и print_r просто говорит вам, что это одно и имя которого оно имеет (какой тип объекта оно есть), остальное, которое он выводит в фигурных скобках, является внутренней информацией этого объекта. Это не вся картина XML, который у вас есть. Даже если это кажется первым.

Так что большое предупреждение здесь, имейте это в виду. Подумайте о том, чтобы отличить строку (или использовать с строковыми функциями, такими как trim()), и все в порядке.

Также не забудьте прочитать Basic SimpleXML usage в руководстве по PHP.

P.S .: Как показывает другой ответ, вы не единственный, у кого проблемы с описанием этой магической природы SimpleXML.

P.P.S .: Возможно, вы захотите узнать об пространствах имен XML, то есть, когда имена элементов имеют двоеточия (возможно, вы уже это сделали, я не вижу их точно из вашего кода).

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