Karan
Karan

Reputation: 267

Parsing XML with PHP?

This has been driving me insane for about the last hour. I'm trying to parse a bit of XML out of Last.fm's API, I've used about 35 different permutations of the code below, all of which have failed. I'm really bad at XML parsing, lol. Can anyone help me parse the first toptags>tag>name 'name' from this XML API in PHP? :(

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

Which in that case ^ would be 'electronic'

Right now, all I have is this

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

Which returns with, blank. No errors either, which is what's incredibly annoying!

Thank You very Much :) :) :)

Any help greatly, and by greatly I mean really, really greatly appreciated! :)

Upvotes: 4

Views: 270

Answers (5)

Dilip Borad
Dilip Borad

Reputation: 179

if you wan't to read xml data please follow those steps,

$xmlURL = "your xml url / file name goes here";

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;
}

You will get array formate of whole xml file.

Thanks.

Upvotes: 0

nachito
nachito

Reputation: 7035

The <tag> tag is an array, so you should loop through them with a foreach or similar construct. In your case, just grabbing the first would look like this:

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

Also note that the <lfm> tag is not needed.

UPDATE

I find it's much easier to grab exactly what I'm looking for in a SimpleXMLElement by using print_r(). It'll show you what's an array, what's a simple string, what's another SimpleXMLElement, etc.

Upvotes: 4

gustavotkg
gustavotkg

Reputation: 4399

You don't need to reference lfm. Actually, $genre already is lfm. Try this:

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

Upvotes: 1

Alan Delimon
Alan Delimon

Reputation: 817

Suggestion: insert a statement to echo $xmlstr, and make sure you are getting something back from the API.

Upvotes: 1

Niels
Niels

Reputation: 49919

Try using

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

Upvotes: 2

Related Questions