youtube.xml
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:gd="http://schemas.google.com/g/2005" xmlns:yt="http://gdata.youtube.com/schemas/2007">
<entry>
...
<yt:duration seconds="1870"/>
...
</entry>
</feed>
update_videos.php
$source = 'youtube.xml';
// load as file
$youtube = new SimpleXMLElement($source, null, true);
foreach($youtube->entry as $item){
//title works
echo $item->title;
//now how to get seconds? My attempt...
$namespaces = $item->getNameSpaces(true);
$yt = $item->children($namespaces['yt']);
$seconds = $yt->duration->attributes();
echo $seconds['seconds'];
//but doesn't work :(
}
So I found a way to do it using xpath, is this the best way or is there a way that's consistent with my code in the question? Just out of curiosity.
The following is another solution using attributes() and children() only, tested and working OK! :)
I was struggling with this situation as well then I found the solution. It's so simple on how to read a complex XML attribute namespace.
Hope it helps...:)
The code you've got in your question does work. You have correctly written that you can access an attribute from a namespaced-element that is not in the default namespace as the root-element by making use of the
SimpleXMLElement::children()
method with the XML-namespace related parameters$ns
and$is_prefix
:As this is basically the same as you did in your question, one could say that you have answered your own question. Compare with the extended Online Demo #2.
Long answer: The code you've got in your question does work. You can find your example XML and code in an interactive example online here: Online Demo #1 - it shows the result with different PHP and LIBXML versions.
Code:
Results:
Output for 5.3.26, 5.4.16 - 5.5.0
Output for 5.3.15 - 5.3.24, 5.4.5 - 5.4.15
Output for 5.1.2 - 5.3.14, 5.4.0 - 5.4.4
From this perspective everything looks fine. As you have not given any concrete error description it's hard to say what went wrong on your case. You were probably using a PHP version that was outdated the time you asked your question, for example getting a fatal error:
Probably also due to an outdated libxml version. According to the test, the following libxml versions work fine with PHP 5.1.2-5.5.0: