Получение значения XML из именованного поля - PullRequest
0 голосов
/ 10 сентября 2018

Извините, что спрашиваю об этом, но это сводит меня с ума. Я использовал php SimpleXMLElement в качестве XML-кода для парсера, и я просмотрел много примеров и разочаровался в этом много раз. Но сейчас мне просто нужно, чтобы это работало. Есть много примеров того, как получить простые поля, но не так много со значениями в полях ...

Я пытаюсь получить значение "track_artist_name" из этого XML в качестве именованной переменной в php.

<nowplaying-info-list>
  <nowplaying-info >
    <property name="track_title"><![CDATA[Song Title]]></property>
    <property name="track_album_name"><![CDATA[Song Album]]></property>
    <property name="track_artist_name"><![CDATA[Song Artist]]></property>
  </nowplaying-info>
</nowplaying-info-list>

Я пытался использовать xpath с:

$sxml->xpath("/nowplaying-info-list[0]/nowplaying-info/property[@name='track_artist_name']"));

Но я знаю, что все испорчено и не работает.

Изначально я тоже пробовал что-то подобное, думая, что это имеет смысл - но нет:

attrs = $sxml->nowplaying_info[0]->property['@name']['track_artist_name'];
echo $attrs . "\n\n";

Я знаю, что могу получить значения с чем-то вроде этого:

$sxml->nowplaying_info[0]->property[2];

Иногда в результатах XML больше строк, чем в других случаях, и поэтому из-за этого он нарушает вычисления неверными данными.

Может кто-нибудь пролить свет на мою проблему? Я просто пытаюсь переименовать художника в переменную. Большое спасибо.

*** ОБНОВЛЕНИЕ РАБОТЫ: **

Я не знал, что существуют разные методы интерпретатора XML, и использовал следующую версию интерпретатора XML:

// read feed into SimpleXML object
$sxml = new SimpleXMLElement($json);

Это не сработало, но теперь обновлено до следующего (для этого раздела кода) благодаря помощи здесь.

$sxml_new = simplexml_load_string($json_raw);
if ( $sxml_new->xpath("/nowplaying-info-list/nowplaying-info/property[@name='track_artist_name']") != null )
{
    $results = $sxml_new->xpath("/nowplaying-info-list/nowplaying-info/property[@name='track_artist_name']");
    //print_r($results);
    $artist = (string) $results[0];
   // var_dump($artist); 
    echo "Artist: " . $artist . "\n";
}

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

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

$results = $sxml->xpath("//nowplaying-info-list/nowplaying-info/property[@name='track_artist_name']");

Также в случае, если у вас есть несколько <nowplaying-info> элементов. Вы можете использовать индекс для этого. (обратите внимание на индекс [1])

$results = $sxml->xpath("//nowplaying-info-list/nowplaying-info[1]/property[@name='track_artist_name']");
0 голосов
/ 10 сентября 2018

Ваше выражение xpath в значительной степени верно, но вам не нужно указывать индекс для элемента <nowplaying-info-list> - он сам справится с этим. Если бы вы указали индекс, он должен начинаться с 1, а не с 0 .

Попробуйте

$results = $sxml->xpath("/nowplaying-info-list/nowplaying-info/property[@name='track_artist_name']");

echo (string) $results[0];

Исполнитель песни

См. https://3v4l.org/eH4Dr

Ваш второй подход:

$sxml->nowplaying_info[0]->property['@name']['track_artist_name'];

Будет пытаться получить доступ к атрибуту с именем @name первого элемента свойства, а не рассматривать его как выражение @ в стиле xpath. Чтобы сделать это без использования xpath, вам нужно перебрать каждый из элементов <property> и проверить их name attibrute.

...