web-dev-qa-db-fra.com

Access @attributes des données dans SimpleXMLElement dans PHP

Je voulais juste commencer par dire que je ai lu BEAUCOUP de questions sur ce site concernant ce problème précis, mais je ne parviens pas à l’appliquer à mon scénario. Si quelqu'un pouvait m'aider, ce serait génial! :)

J'essaie d'extraire des données du XML suivant:

$myXML = '<?xml version="1.0" encoding="UTF-8"?>
<products><product uri="https://192.168.110.201:9630/api/products/1807/" id="1807"    resource_type="current"><code>DEMO - MC700X/A</code><flags><inventoried>true</inventoried><editable_sell>false</editable_sell><master_model>false</master_model></flags><sell_price>0.00</sell_price><description>Apple MC700X/A Demo</description><inventory><available>7</available><reserved>0</reserved><coming_for_stock>2.0</coming_for_stock><coming_for_customer>0.0</coming_for_customer><warehouses>0</warehouses><total>7</total></inventory><product_photos/></product></products>';

J'utilise SimpleXML pour le mettre dans une variable (objet?) PHP comme ceci:

$xml = new SimpleXMLElement($myXML);

Si je fais un:

echo '<pre>';
print_r($xml);
echo '</pre>';

Je reçois ce qui suit:

SimpleXMLElement Object
(
    [product] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [uri] => https://192.168.110.201:9630/api/products/1807/
                    [id] => 1807
                    [resource_type] => current
                )

            [code] => DEMO - MC700X/A
            [flags] => SimpleXMLElement Object
                (
                    [inventoried] => true
                    [editable_sell] => false
                    [master_model] => false
                )

            [sell_price] => 0.00
            [description] => Apple MC700X/A Demo
            [inventory] => SimpleXMLElement Object
                (
                    [available] => 7
                    [reserved] => 0
                    [coming_for_stock] => 2.0
                    [coming_for_customer] => 0.0
                    [warehouses] => 0
                    [total] => 7
                )

            [product_photos] => SimpleXMLElement Object
                (
                )

        )

)

Maintenant, lorsque j'essaie d'accéder à ces données par programme, les opérations suivantes fonctionnent bien:

// This returns the value as expected
echo '<pre>';
echo($xml->product->code);
echo '<br>';
echo($xml->product->sell_price);
echo '<br>';
echo($xml->product->inventory->available);
echo '<br>';
echo '</pre>';

Cela retourne:

DEMO - MC700X/A
0.00
7

Mais je dois pouvoir accéder à la balise "id" dans l'élément "product" de base (c'est-à-dire le bit @attributes), mais je n'y arrive pas. J'ai beaucoup lu et compris que je devrais être capable d'utiliser la méthode attributes (), mais je ne peux pas le faire exactement.

Essayer cela n'a pas fonctionné:

echo '<pre>';
echo($xml->attributes());
echo '<br>';
echo '</pre>';

Ça ne retourne rien. Quelqu'un peut-il m'aider s'il vous plaît? Je veux pouvoir afficher la balise "id" .. c'est-à-dire ce à quoi je m'attendrais:

echo $xml['product']['@attributes']['id'];

évidemment ne fonctionne pas non plus.

Merci !! John

24
John Cleary

As-tu essayé:

echo (string)$xml->product->attributes()->id;

Cela devrait vous donner accès aux attributs.

Si vous avez plus d'un produit, il se peut que

echo (string)$xml->product[0]->attributes()->id;

Vous pouvez également accéder aux attributs en utilisant une notation de tableau régulière telle que:

$xml->product['id']; // instead of $xml->product->attributes()->id

Voir Exemple # 5 dans les exemples SimpleXML ainsi que sur la page de manuel relative à SimpleXMLElement :: attributs () pour plus d'informations.

54
drew010
$array = (array)$obj;
$prop_id = $array['@attributes'];
0
邱威润