0

This is a follow-on question to this: Getting XML attributes in PHP

I'm struggling to get element values with a namespace prefix. See this example from here: http://itunes.apple.com/us/rss/toppaidapplications/limit=10/genre=6014/xml

<im:image height="53">http://a2.mzstatic.com/us/r1000/114/Purple/v4/bc/0e/86/bc0e8619-5d48-1efe-2ac3-662696fb9a34/mzl.bimldzcn.53x53-50.png</im:image>          
<im:image height="75">http://a3.mzstatic.com/us/r1000/114/Purple/v4/bc/0e/86/bc0e8619-5d48-1efe-2ac3-662696fb9a34/mzl.bimldzcn.75x75-65.png</im:image>

If I try and reference the element using $e->im:image I get the following error:

PHP Parse error:  syntax error, unexpected ':' 

$e->'im:image' gives me:

PHP Parse error:  syntax error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting T_STRING or T_VARIABLE or '{' or '$' 

Any suggestions?

UPDATE: I've edited the question title which was misleading. It's actually element values with a namespace prefix (not attributes) that I'm interested in.

3 Answers 3

3

When using SimpleXML (as suggested by your previous question) you have to use the children() method to fetch all child elements of a certain namespace, same with attributes().

e.g.

<?php
define('URI_RSS', 'http://itunes.apple.com/rss');
$feed = new SimpleXMLElement(getData());

foreach( $feed->entry as $entry ) {
    $attributes = $entry->id->attributes(URI_RSS);
    echo 'id[im:id]: ', $attributes['id'], "\n";

    $attributes = $entry->category->attributes(URI_RSS);
    echo 'category[im:id]: ', $attributes['id'], "\n";

    $imElements = $entry->children(URI_RSS);
    foreach( $imElements as $name=>$c ) {
        echo $name, '=', $c, "\n";
    }
}

function getData() {
    return <<< eot
<?xml version="1.0" encoding="utf-8"?>

    <feed xmlns:im="http://itunes.apple.com/rss" xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
        <id>someid</id><title>some title</title><updated>2012-09-10T02:12:06-07:00</updated><link rel="alternate" type="text/html" href="http://link1"/><link rel="self" href="http://link12"/><icon>http://iconlink1</icon><author><name>some name</name><uri>http://uri</uri></author><rights>all rights wronged</rights>

            <entry>
                <updated>2012-09-10T02:12:06-07:00</updated>

                    <id im:id="123456789" im:bundleId="a.bundle.id">http://id</id>

                    <title>some title</title>

                    <summary>This is the summary.

A short text summarizing the complete article
</summary>

                    <im:name>imname</im:name>

                    <link rel="alternate" type="text/html" href="http://alternate"/>

                    <im:contentType term="Application" label="Application"/>

                    <category im:id="7890" term="example" scheme="http://scheme" label="example"/>

                    <link title="Preview" rel="enclosure" type="image/jpeg" href="http://preview" im:assetType="preview"><im:duration>0</im:duration></link>

                    <im:artist href="http://artist">sample artist</im:artist>

                    <im:price amount="0.99000" currency="USD">$0.99</im:price>

                    <im:image height="53">http://1.png</im:image>

                    <im:image height="75">http://2.png</im:image>

                    <im:image height="100">http://3.png</im:image>

                    <rights>all rights wronged</rights>

                    <im:releaseDate label="August 28, 2012">2012-08-28T00:00:00-07:00</im:releaseDate>


                    <content type="html">content
                    content
                    content
</content>

            </entry>
        </feed>
eot;
}

prints

id[im:id]: 123456789
category[im:id]: 7890
name=imname
contentType=
artist=sample artist
price=$0.99
image=http://1.png
image=http://2.png
image=http://3.png
releaseDate=2012-08-28T00:00:00-07:00
Sign up to request clarification or add additional context in comments.

3 Comments

Sorry - updated question to make it more accurate. It's the element values I'm interested in NOT the attributes.
OK. Clearly this works although I ended up using a simpler method (see my answer) but I'm going to tick yours off as it's more comprehensive.
it's the same method, $entry->children(URI_RSS);, I just defined URI_RSS ;-)
0

-->php domdocument
-->get Elements by tag name and namespace

Comments

0

OK, got it.

Answer is to specify the namespace.

E.g. see previous question and use:

$im = $e->children('http://itunes.apple.com/rss');

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.