【问题标题】:Parsing XML with PHP?用 PHP 解析 XML?
【发布时间】:2011-11-17 14:23:01
【问题描述】:

在过去的一个小时里,这让我发疯了。我正在尝试从 Last.fm 的 API 中解析一些 XML,我使用了以下代码的大约 35 种不同排列,所有这些都失败了。我真的不擅长 XML 解析,哈哈。谁能帮我解析 PHP 中这个 XML API 中的第一个 toptags>tag>name 'name'? :(

http://ws.audioscrobbler.com/2.0/?method=track.getinfo&api_key=b25b959554ed76058ac220b7b2e0a026&artist=Owl+city&track=fireflies

在这种情况下 ^ 将是“电子”

我现在只有这个

<?
$xmlstr = file_get_contents("http://ws.audioscrobbler.com/2.0/?method=track.getinfo&api_key=b25b959554ed76058ac220b7b2e0a026&artist=Owl+city&track=fireflies");
$genre = new SimpleXMLElement($xmlstr);
echo $genre->lfm->track->toptags->tag->name;
?>

返回,空白。也没有错误,这是令人难以置信的烦人!

非常感谢你:) :) :)

任何帮助都非常大,我的意思是非常非常非常感谢! :)

【问题讨论】:

  • $genre->track->toptags->tag[0]->name; ?

标签: php xml


【解决方案1】:

&lt;tag&gt; 标记是一个数组,因此您应该使用foreach 或类似的构造循环它们。在你的情况下,只抓住第一个看起来像这样:

<?
$xmlstr = file_get_contents("http://ws.audioscrobbler.com/2.0/?method=track.getinfo&api_key=b25b959554ed76058ac220b7b2e0a026&artist=Owl+city&track=fireflies");
$genre = new SimpleXMLElement($xmlstr);
echo $genre->track->toptags->tag[0]->name;

另请注意,不需要&lt;lfm&gt; 标签。

更新

我发现使用print_r() 在 SimpleXMLElement 中准确获取我要查找的内容要容易得多。它会告诉你什么是数组,什么是简单字符串,什么是另一个 SimpleXMLElement,等等。

【讨论】:

  • 我爱你,无法理解。非常非常感谢你。我尝试了完全相同的事情,但是在轨道之前直接使用 lfm,但没有成功。非常非常感谢你! :)
【解决方案2】:

尝试使用

$url = "http://ws.audioscrobbler.com/2.0/?method=track.getinfo&api_key=b25b959554ed76058ac220b7b2e0a026&artist=Owl+city&track=fireflies";
$xml = simplexml_load_file($url);
echo $xml->track->toptags->tag[0]->name;

【讨论】:

  • 感谢您的回答! :) 帮助很大! :D
  • 这有什么帮助? simplexml 无论如何都会自己做一个 file_get_contents (或者使用 curl,无论如何)。最后它仍然会加载相同的 xml 并使用错误的标签路径。 `->tag-> 是一个数组,而不是单个标签。
  • 我粘贴的代码是没有数组的代码(我开始尝试很多东西,沮丧:P file_get_contents 和 simplexml_load_file 应该做同样的事情,除了 simpleXML 的加载器似乎运行有点慢我的服务器,这就是我坚持使用 file_get_contents 的原因——感谢您的回答:)
【解决方案3】:

建议:插入一条回显 $xmlstr 的语句,并确保您从 API 获取 一些东西

【讨论】:

  • 哦,谢谢你的建议 :) 我必须解析其他东西以防万一失败! :S 谢谢!
【解决方案4】:

您无需引用lfm。实际上,$genre 已经是lfm。试试这个:

echo $genre->track->toptags->tag->name;

【讨论】:

  • 感谢您的回答!由于第一个答案几乎是你的,数组值为 0 ,我已经让它工作了 :) 谢谢! :)
  • 是的,似乎如果不为tag 数组传递任何索引,它将使用第一个。在这种情况下,eletronic.
【解决方案5】:

如果您不想读取 xml 数据,请按照这些步骤操作,

$xmlURL = "你的 xml url / 文件名放在这里";

try {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $xmlURL);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-type: text/xml'
    ));
    $content = curl_exec($ch);
    $error   = curl_error($ch);
    curl_close($ch);
    $obj = new SimpleXMLElement($content);
    echo "<pre>";
    var_dump($obj);
    echo "</pre>"; 
}
catch(Exception $e){
    var_dump($e);exit;
}

您将获得整个 xml 文件的数组格式。

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 2010-11-23
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多