SimpleXMLElement: получение атрибута пространства имен

Я прочитал о сотнях SO-записей об этом, но я не могу заставить его работать. Я действительно не вижу, что я делаю неправильно. Я определенно делаю что-то явно глупое, но в данный момент я этого не вижу.

Я пытаюсь разобрать http://api.spreadshirt.net/api/v1/shops/614852/productTypes?locale=de_DE&fullData=false&limit=20&offset=0

Вот что я делаю:

$shopUrl = "http://api.spreadshirt.net/api/v1/shops/614852/productTypes?".
    "locale=de_DE&fullData=false&limit=20&offset=0"


$ch = curl_init($shopUrl);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
$result = curl_exec($ch);
curl_close($ch);    

$products = new SimpleXMLElement($result);  

foreach ($products->productType as $product) {
    $resources = $product->children('http://www.w3.org/1999/xlink');
    $resEntity = array(
        'id' => (int)$product->attributes()->id,
        'name' => (string)$product->name[0],
        'price' => (string)$product->price[0]->vatIncluded[0],
        'preview' => $resources
    );
    echo '<pre>'.print_r($resEntity, true).'</pre>';    
}

Это выводит меня

Array
(
    [id] => 6
    [name] => Männer T-Shirt klassisch
    [price] => 9.90
    [preview] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [href] => http://api.spreadshirt.net/api/v1/shops/614852/productTypes/6
                )

        )

)

Сейчас я пытаюсь получить доступ к HREF-атрибуту, но все, что я пробовал до сих пор, например, $resources->attributes()->href или $resources['href'], но PHP продолжает говорить Node no longer exists.


person marekventur    schedule 07.05.2011    source источник


Ответы (1)


Вы должны указать пространство имен в методе attributes(). Я предполагаю (это не объясняется подробно в руководстве attributes()), вы должны указать пространство имен xml с первым аргументом. Это может дать вам атрибут href из пространства имен xlink. В противном случае вы просто получаете атрибуты из пространства имен xml по умолчанию, а именно type и mediaType (или из какого узла вы извлекаете атрибуты).

Это должно работать так (не проверено):

$resources = $product->resources[0];   // <resources> node
$resource = $resources->resource[0];   // first <resource> node
$attribs = $resource->attributes('http://www.w3.org/1999/xlink');   // fetch all attributes from the given namespace
var_dump($attribs->href);   // or maybe var_dump((string)$attribs->href);
person Progman    schedule 07.05.2011
comment
Спасибо! Это работает как шарм. 'preview' => (string)$attribs->href[0] - person marekventur; 07.05.2011