Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML > SimpleXML
SimpleXML Forum d'entraide pour l'extension SimpleXML, qui permet de manipuler des documents XML en PHP (approche DOM).
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/08/2007, 20h00   #1
Nouveau Membre du Club
 
Inscription : octobre 2004
Messages : 74
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 74
Points : 30
Points : 30
Par défaut [SimpleXML] Accéder aux attributs d'un objet

Bonjour

j'ai un objet $foo qui me retourne la valeur ci-dessous quand je fais un print_r (il s'agit d'un flux xml)
Je voudrais atteindre directement sans boucle la valeur de href dans le 2eme tableau mais je ne vois pas comment faire.

J'ai essayé avec echo $objet['href']; mais cela me renvoit la valeur de href dans le premier tableau, pas le deuxieme
Est-ce que je suis obligé de faire une boucle sur la tableau du style donne moi la valeur de [href] si [rel]=enclosure
Merci pour votre aide, ci-dessous le resultat de print_r($objet)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [rel] => alternate
            [type] => text/xhtml
            [title] => Title
            [href] => /mapage/toto
        )
 
)
SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [rel] => enclosure
            [title] => Title
            [width] => 384
            [height] => 288
            [href] => http://www.xxxxxx.com/swf/2W7qlUF4jTKH
            [type] => application/x-shockwave-flash
        )
 
)
DeezerD est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2007, 20h58   #2
Modérateur
 
Avatar de mathieu
 
Inscription : juin 2003
Messages : 4 893
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 4 893
Points : 4 466
Points : 4 466
pour accéder directement à l'attribut, utilise $objet->href
__________________
Modérateur PHP
mathieu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2007, 21h24   #3
Nouveau Membre du Club
 
Inscription : octobre 2004
Messages : 74
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 74
Points : 30
Points : 30
ça ne renvoie rien
je ne comprends d'ailleurs pas comment on peut trouver plusieurs fois [@attributes] dans cet objet
une idée?
DeezerD est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2007, 21h48   #4
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Normalement vous pouvez l'atteindre directement mais la notion de "tableau" n'a aucune signification ici puisque le document XML possède une structure hiérarchique que l'on retrouve lors de l'exploitation avec une API et c'est d'autant plus vrai avec l'extension SimpleXML de par sa conception. Bref, il faudrait être plus précis et un exemple de document XML serait bien plus parlant.

Pour illustrer mes propos, soit le document XML suivant :
Code XML :
1
2
3
4
5
6
7
8
9
10
<A attr="val_a">
    <B attr="val_b1">
        <C/>
    </B>
    <B attr="val_b2">
        <C>
            <D>texte</D>
        </C>
    </B>
</A>
Et la création de l'objet SimpleXML :
Code :
$sxml = simplexml_load_file('mon_fichier.xml');
Code :
1
2
3
4
5
6
7
8
9
echo $sxml->B[1]['attr']; // Résultat : "val_b2"
 
foreach ($sxml->B as $b) {
    echo $b['attr']; // Résultat : "val_b1" puis "val_b2"
}
 
echo $sxml->B[1]->C->D; // Résultat : "texte"
 
# ...
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2007, 22h51   #5
Nouveau Membre du Club
 
Inscription : octobre 2004
Messages : 74
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 74
Points : 30
Points : 30
merci, je fais effectivement marcher mon script dans le cadre d'une api dailymotion

Prenons donc un exemple avec une url et le flux atom associé
http://www.dailymotion.com/atom/vide...ience_creation


Code :
1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>En chien de faience</title>
  <published>2007-01-20T01:26:16+01:00</published>
  <updated>2007-08-27T18:35:38+02:00</updated>
  <id>http://www.dailymotion.com/video/x10qmn_en-chien-de-faience_creation</id>
  <entry>
    <link rel="alternate" type="text/xhtml" href="/atom/htmls/video/x10qmn_en-chien-de-faience_creation" title="En chien de faience"/>
    <link rel="enclosure" title="En chien de faience" width="320" height="240" href="http://www.dailymotion.com/swf/312avXBoEGleO7bVd" type="application/x-shockwave-flash"/>
Code :
1
2
3
4
5
6
7
8
9
10
11
$request = 'http://www.dailymotion.com/atom/video/x10qmn_en-chien-de-faience_creation';
 
$session = curl_init($request);
curl_setopt($session, CURLOPT_HEADER, false);
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($session);
curl_close($session); 
 
$parsed_xml = simplexml_load_string($response);
 
print_r($parsed_xml);
et je souhaiterais donc accéder à la valeur de l'attribut href sur le 2eme tag link
<link rel="enclosure" title="En chien de faience" width="320" height="240" href="http://www.dailymotion.com/swf/312avXBoEGleO7bVd" type="application/x-shockwave-flash"/>
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
SimpleXMLElement Object
(
    [title] => En chien de faience
    [published] => 2007-01-20T01:26:16+01:00
    [updated] => 2007-08-27T18:35:38+02:00
    [id] => http://www.dailymotion.com/video/x10qmn_en-chien-de-faience_creation
    [entry] => SimpleXMLElement Object
        (
            [link] => Array
                (
                    [0] => SimpleXMLElement Object
                        (
                            [@attributes] => Array
                                (
                                    [rel] => alternate
                                    [type] => text/xhtml
                                    [href] => /atom/htmls/video/x10qmn_en-chien-de-faience_creation
                                    [title] => En chien de faience
                                )
 
                        )
 
                    [1] => SimpleXMLElement Object
                        (
                            [@attributes] => Array
                                (
                                    [rel] => enclosure
                                    [title] => En chien de faience
                                    [width] => 320
                                    [height] => 240
                                    [href] => http://www.dailymotion.com/swf/2BDdDWEPOyv557bVd
                                    [type] => application/x-shockwave-flash
                                )
 
                        )
j'espere que ma réponse apporte les éclaircissements nécessaires sur ma question
DeezerD est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2007, 10h56   #6
Modérateur
 
Avatar de mathieu
 
Inscription : juin 2003
Messages : 4 893
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 4 893
Points : 4 466
Points : 4 466
essaye ça :
Code :
$parsed_xml->entry->link[1]['href']
__________________
Modérateur PHP
mathieu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2007, 11h13   #7
Nouveau Membre du Club
 
Inscription : octobre 2004
Messages : 74
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 74
Points : 30
Points : 30
merci beaucoup, ça marche!
(en relisant le code ce matin, ça m'a semblé comme une évidence, j'avais trop la tête dans le guidon hier )
DeezerD est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2007, 11h33   #8
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Un détail : l'emploi de cURL est dû à la valeur de la directive allow_url_fopen (Off) ? Parce que l'extension SimpleXML, sinon, est tout à fait capable de parser directement un document distant.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2007, 16h29   #9
Nouveau Membre du Club
 
Inscription : octobre 2004
Messages : 74
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 74
Points : 30
Points : 30
Citation:
Envoyé par julp Voir le message
Un détail : l'emploi de cURL est dû à la valeur de la directive allow_url_fopen (Off) ? Parce que l'extension SimpleXML, sinon, est tout à fait capable de parser directement un document distant.
merci pour cette remarque, en fait je ne me suis pas posé la question puisque j'ai repris un script déjà existant
Il est vrai que cURL nécessite d'être activé sur le serveur, mais en terme de performance et de temps d'execution (et en nombre de lignes de code), j'ai le même résultat qu'avec fopen() pour récupérer le document à parser...

Si vous avez un avis là dessus en terme de "meilleure" pratique, ça m'interesse grandement
DeezerD est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2007, 16h35   #10
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Lorsque allow_url_fopen est à On, il y a plus simple :
Code :
1
2
3
$parsed_xml = simplexml_load_file(/*rawurlencode(*/$request/*)*/); # rawurlencode est nécessaire pour les versions < 5.1.0
# Ou avec le constructeur :
$parsed_xml = new SimpleXMLElement($request, NULL, TRUE);
Nul besoin de passer par un intermédiaire. Cependant, difficile de trouver un moyen portable
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2007, 16h39   #11
Nouveau Membre du Club
 
Inscription : octobre 2004
Messages : 74
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 74
Points : 30
Points : 30
c'est parfait, merci beaucoup
DeezerD est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h21.


 
 
 
 
Partenaires

Hébergement Web