【问题标题】:When extracting artist name from XML file only 1 record shows从 XML 文件中提取艺术家姓名时,仅显示 1 条记录
【发布时间】:2011-08-03 14:23:31
【问题描述】:

我已经在堆栈上进行了搜索,但据我所知,没有任何问题或答案可以直接回答这个问题。

我有以下代码:

$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>

感谢您的帮助或指导。

【问题讨论】:

  • 你在找foreach
  • @gordon 我尝试了一个 foreach 但它仍然只注册 1 条记录
  • foreach(simplexml_load_file('http://…')-&gt;artists-&gt;artist as $artist) { echo $artist-&gt;name; }
  • @Gordon - 这会显示服务器错误
  • 那么你做错了什么。如果该 URL 托管上面显示的 XML,我给您的 sn-p 将回显所有艺术家的姓名。见codepad.org/c0ZL1hLZ

标签: php xml


【解决方案1】:
foreach ($xml->artists->children() as $child)
{
  $artist = (string)$child->name;
  echo $artist;
}

【讨论】:

    【解决方案2】:

    您将需要使用 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 />';
    }
    

    【讨论】:

    • 抱歉更多细节和使用和不使用 xpath 的工作示例:
    【解决方案3】:

    添加到您的代码中,如下所示:

    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)。

    【讨论】:

    • 感谢您的帮助,我希望它显示所有名称,以便 Name1 Name2 和 Name3
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    相关资源
    最近更新 更多