Shlomo
Shlomo

Reputation: 3990

easy xpath query but no results

Trying to get all URLs values from xml.

I have hundreds of entry exactly in the form like e.g. this entry 16:

<?xml version="1.0" encoding="utf-8" ?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <entries>
   <entry id="16">
      <revision number="1" status="accepted" wordclass="v" nounclasses="" unverified="false"></revision>
      <media type="audio" url="http://website.com/file/65.mp3" />
      </entry>
   <entry id="17">
      ....
   </entry>
</entries>
</root>

I am using this code but cannot get it to work. Why?

$doc = new DOMDocument;

$doc->Load('data.xml');

$xpath = new DOMXPath($doc);

$query = '//root/entries/entry/media';

$entries = $xpath->query($query);

What is the correc query for that? Best would be to only get the url value.

Upvotes: 2

Views: 482

Answers (2)

hakre
hakre

Reputation: 198237

I would do that with SimpleXML actually:

$file  = 'data.xml';
$xpath = '//root/entries/entry/media/@url';

$xml  = simplexml_load_file($file);
$urls = array();

if ($xml) {
    $urls = array_map('strval', $xml->xpath($xpath));
}

Which will give you all URLs as strings inside the $urls array. If there was an error loading the XML file, the array is empty.

Upvotes: 1

Nick Andriopoulos
Nick Andriopoulos

Reputation: 10663

Your query probably returns the proper elements, but by default gives you the content of the media tag ( which in your case are empty, since the tag is self-closing ).

To get the url attribute of the tag you should use getAttribute(), example :

$entries = $xpath->query('//root/entries/entry/media');
foreach($entries as $entry) { 
  print $entry->getAttribute("url")."<br/>";
}

Or you should just xpath-query the attribute instead and read out it's value:

$urlAttributes = $xpath->query('//root/entries/entry/media/@url');
                                                          #####
foreach ($urlAttributes as $urlAttribute)
{ 
    echo $urlAttribute->value, "<br/>\n";
                        #####
}

See DOMAttr::$valueDocs:

value


The value of the attribute

Upvotes: 2

Related Questions