При извлечении имени исполнителя из файла XML отображается только 1 запись - PullRequest
0 голосов
/ 03 августа 2011

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

У меня есть следующий код:

$xml_data = file_get_contents('http://www.test.co.uk/charts.xml');
$xml = new SimpleXMLElement($xml_data);

$artist = $xml->artists->artist->name;
echo $artist;

Однако, когда я запускаюкод показывает только имя первого исполнителя, кто-нибудь знает, как я мог заставить его показать все имена в XML-файле.

Для справки, XML-файл выглядит следующим образом:

<artists_chart start="" end="">
<period>Past 7 days</period>
<artists>
<artist gid="">
<name>Name1</name>
<plays>51</plays>
<previous_plays>53</previous_plays>
</artist>
<artist gid="">
<name>Name2</name>
<plays>45</plays>
<previous_plays>97</previous_plays>
</artist>
<artist gid="">
<name>Name3</name>
<plays>41</plays>
<previous_plays>39</previous_plays>
</artist>
</artists>
</artists_chart>

Спасибо за любую помощь или руководство.

Ответы [ 3 ]

2 голосов
/ 03 августа 2011
foreach ($xml->artists->children() as $child)
{
  $artist = (string)$child->name;
  echo $artist;
}
1 голос
/ 03 августа 2011

Вам нужно будет использовать xpath, чтобы выбрать узлы (исполнители / исполнители), а затем повторить набор результатов.XPath и PHP достаточно хорошо описаны на http://php.net/manual/en/simplexmlelement.xpath.php

В частности, на ваш вопрос:

$xml_data = file_get_contents('http://www.test.co.uk/charts.xml');
$xml = new SimpleXMLElement($xml_data);

$artists = $xml->xpath('/artists/artist');
if($artists) foreach($artsts as $artist){
  echo $artist->name;
}

РЕДАКТИРОВАТЬ с обновленным кодом:

<?php

$xml_data = <<<XML
<artists_chart start="" end="">
  <period>Past 7 days</period>
  <artists>
    <artist gid="">
      <name>Name1</name>
      <plays>51</plays>
      <previous_plays>53</previous_plays>
    </artist>
    <artist gid="">
      <name>Name2</name>
      <plays>45</plays>
      <previous_plays>97</previous_plays>
    </artist>
    <artist gid="">
      <name>Name3</name>
      <plays>41</plays>
      <previous_plays>39</previous_plays>
    </artist>
  </artists>
</artists_chart>
XML;

$xml = new SimpleXMLElement($xml_data);

$artists = $xml->xpath('/artists_chart/artists/artist');
if($artists) foreach($artists as $artist){
  echo $artist->name.'<br />';
}
echo('<hr />');
// or
foreach($xml->artists->artist as $artist){
  echo $artist->name.'<br />';
}
0 голосов
/ 03 августа 2011

добавить к вашему коду, чтобы выглядеть так:

error_reporting(E_ALL);
ini_set('display_errors', 1);
$xml_data = file_get_contents('http://www.test.co.uk/charts.xml');
....

и вы увидите:

Warning: SimpleXMLElement::__construct(): Entity: line 6: parser error : Entity 'copy' not defined in 
.......

РЕДАКТИРОВАТЬ 1

извините, эта ошибка означает только «доступ запрещен». но если я копирую ваш xml как текст - у меня все работает (и отображает Name1).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...