使用PHP解析XML?

4

这已经让我发疯了大约一个小时。我正在尝试从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;
?>

这个返回值是空的,也没有错误提示,真的非常烦人!

非常感谢 :) :) :)

非常需要帮助,我指的是真的非常需要!:)


1
$genre->track->toptags->tag[0]->name; ? - Catalin
5个回答

4

<tag>标签是一个数组,因此您应该使用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;

请注意,不需要使用<lfm>标签。

更新

我发现使用print_r()可以更轻松地获取SimpleXMLElement中我要查找的内容。它会显示哪些是数组、哪些是简单字符串、哪些是另一个SimpleXMLElement等等。


我爱你超乎想象。非常,非常感谢你。我尝试了完全相同的事情,但是在“track”之前直接放置“lfm”,并没有起作用。非常,非常感谢! :) - Karan

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;

这会有什么帮助吗?simplexml 最终也会自己执行 file_get_contents(或使用 curl,无论哪种方式)。最终它仍将加载相同的 xml 并使用错误的标签路径。 ->tag-> 是一个数组,而不是单个标签。 - Marc B
我粘贴的代码是没有数组的那个(我开始尝试很多东西,感到沮丧)。file_get_contents和simplexml_load_file基本上应该做相同的事情,除了simpleXML的加载器在我的服务器上运行有点慢,这就是为什么我坚持使用file_get_contents的原因--谢谢你的回答:) - Karan

1
建议:插入一个语句来回显 $xmlstr,并确保您从 API 中得到了 某些 返回值。

哦,谢谢你的建议 :) 不过如果失败了,我还得解析其他东西!:S 谢谢! - Karan

1

你不需要引用lfm。实际上,$genre已经是lfm了。试试这个:

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

谢谢你的回答!我已经把它搞定了,多亏了第一个回答,基本上就是你的答案,只不过数组值为0 :) 谢谢你! :) - Karan
是的,看起来如果没有为“tag”数组传递任何索引,它将使用第一个。在这种情况下,是“电子”。 - gustavotkg

0
如果您想要读取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 文件的数组格式。

谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接