IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[XML] Boucle et attribut avec xml


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut [XML] Boucle et attribut avec xml
    Bonjour,

    Je cherche une boucle pour extraire les adresses par l'attribut deb :
    Mais je ne réussi pas depuis le noeud de chaque attribut

    Comment éliminer les doublons ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    <?php
    $xml = <<< EOT
    <?xml version="1.0" encoding="utf-8"?>
     
    <root>
     
    <repertoire>
    	<even deb="10/02/2018">
    		<fin></fin>
    		<adresse>8h15-SkiDeFond-Skiathlon-2x7,5km (F)</adresse>
    		<adresse>11h00-ShortTrack-1500m (H)</adresse>
    	</even>
     
    	<even deb="11/02/2018">
    		<fin></fin>
    		<adresse>12h15-BiathlonSprint-7,5km (F)</adresse>
    		<adresse>16h35-SautAski-Tremplin normal (H)</adresse>
    	</even>
     
    </repertoire>
     
    </root>
    EOT;
     
    $dom = new DomDocument;
    $dom->preserveWhiteSpace = FALSE;
    $dom->loadXML($xml);
    $params = $dom->getElementsByTagName('even'); 
    $k=0;
     
    foreach ($params as $param) 
    {
            echo "Even attribut :-> ".$params->item($k)->getAttribute('deb')."<br>";  
            $adr = $dom->getElementsByTagName('adresse');
    		for ($i = 0; $i < $adr->length; $i++) {
    		echo $i.': '.$adr->item($i)->nodeValue.'<br>';
     
    		}
     
            $k++; 
     
    }
     
    ?>
    Even attribut :-> 10/02/2018
    0: 8h15-SkiDeFond-Skiathlon-2x7,5km (F)
    1: 11h00-ShortTrack-1500m (H)
    2: 12h15-BiathlonSprint-7,5km (F)
    3: 16h35-SautAski-Tremplin normal (H)
    Even attribut :-> 11/02/2018
    0: 8h15-SkiDeFond-Skiathlon-2x7,5km (F)
    1: 11h00-ShortTrack-1500m (H)
    2: 12h15-BiathlonSprint-7,5km (F)
    3: 16h35-SautAski-Tremplin normal (H)

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Tu obtiens des doublons tout simplement parce que dans ta boucle foreach (sur les éléments "even") au lieu de demander les éléments "adresse" à partir du nœud courant, tu demandes les éléments "adresse" pour tout le document: $adr = $dom->getElementsByTagName('adresse');. Il faudrait plutôt écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $adr = $param->getElementsByTagName('adresse');
    Tu n'as pas besoin non plus de compter les items ni de cette boucle for, un foreach fait ça très bien.
    $dom->preserveWhiteSpace = FALSE; n'est utile que si tu comptes éditer le xml. Au passage en écrivant "FALSE" en minuscule tu aurais beaucoup moins mal au yeux.
    Moi j'écrirais ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $dom = new DOMDocument;
    $dom->loadXML($xml);
    $params = $dom->getElementsByTagName('even'); 
     
    foreach ($params as $param) {
        echo 'Even attribut :-> ', $param->getAttribute('deb'), '<br>';  
        $adrs = $param->getElementsByTagName('adresse');
        foreach ($adrs as $k=>$adr) {
            echo $k, ': ', $adr->nodeValue, '<br>';
        }
    }
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut
    Je vois ce qui manque. Ce qui laisse le doute c'est la structure du xml, qui ensuite peut poser
    des soucis ...

    <repertoire>

    <even deb="10/02/2018">
    <fin></fin>
    <adresse>8h15-SkiDeFond-Skiathlon-2x7,5km (F)</adresse>
    <adresse>11h00-ShortTrack-1500m (H)</adresse>
    </even>

    <even deb="11/02/2018">
    <fin></fin>
    <adresse>12h15-BiathlonSprint-7,5km (F)</adresse>
    <adresse>16h35-SautAski-Tremplin normal (H)</adresse>
    </even>

    <even>
    <debut>31/01/2018</debut>
    <fin></fin>
    <adresse>8h15-SkiDeFond-Skiathlon-2x7,5km (F)</adresse>
    <adresse>11h00-ShortTrack-1500m (H)</adresse>
    <adresse>12h00-PatinageDeVitesse-3000m (</adresse>
    <adresse>12h15-BiathlonSprint-7,5km (F)</adresse>
    <adresse>13h35-SautAski-Tremplin normal (H)</adresse>
    </even>

    </repertoire>
    J'ai ajouté deb comme attribut pour lister plusieurs adresses [ solution 2 ]
    Mais est ce possible de lister adresse avec debut comme balise ?
    [ solution 1 : actuelle qui a été plus rapide à écrire au format xml ]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    foreach ($params as $param) {
        //echo 'Even attribut :-> ', $param->getAttribute('deb'), '<br>'; 
        $deb = $param->getElementsByTagName('debut');
        $adrs = $param->getElementsByTagName('adresse');
        echo 'Debut  :-> ', $deb->nodeValue, '<br>'; // erreur
        foreach ($adrs as $k=>$adr) {
    		//echo 'Debut attribut :', $deb->nodeValue, '<br>'; 
            echo $k, ': ', $adr->nodeValue, '<br>';
        }
    }
    Il y a erreur pour obtenir début : ->

  4. #4
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    foreach ($params as $param) {
        echo 'Even attribut :-> ', $param->getAttribute('deb'), '<br>'; 
        $debs = $param->getElementsByTagName('debut');
        $adrs = $param->getElementsByTagName('adresse');
     
        foreach ($debs as $k=>$deb) {
    		echo 'Debut : ', $deb->nodeValue, '<br>';
    	}
     
        foreach ($adrs as $k=>$adr) {
    		//echo 'Debut :', $debs->nodeValue, '<br>'; 
            echo $k, ': ', $adr->nodeValue, '<br>';
        }
    }
    Doubler foreach est la solution


  5. #5
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Citation Envoyé par bm Voir le message
    Doubler foreach est la solution
    Ah bah non là pour le coup il ne faut pas utiliser foreach puisque l'élément "debut" est unique pour chaque élément "even":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    foreach ($params as $param) {
        $deb = $param->getElementsByTagName('debut')->item(0);
        $adrs = $param->getElementsByTagName('adresse');
        echo 'Debut : ', $deb->nodeValue, '<br>';
     
        foreach ($adrs as $k=>$adr) {
            echo $k, ': ', $adr->nodeValue, '<br>';
        }
    }
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  6. #6
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut
    <adresse>SautASkiJuniors-Kandersteg</adresse>
    <adresse>Voyage-Vers-Orion</adresse>
    <adresse>https://youtu.be/xCFg5udYbAg</adresse>
    <adresse>[https://youtu.be/xCFg5udYbAg]</adresse>
    Ok

    Quels sont les caractères autorisés dans un fichier xml avec l'entête ?

    <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
    le crochet ne passe pas ...
    Ou cela vient de php !

  7. #7
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Il n'y a aucune raison que les crochets posent un quelconque problème. Quant à l'encodage spécifié dans la déclaration xml, il n'a rien à voir la dedans.

    le crochet ne passe pas ...
    C'est assez faiblard comme description.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  8. #8
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut
    Description trop rapide !
    Je me demande comment passer une url avec xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <adresse>SautASkiJuniors-Kandersteg</adresse>
    <adresse>Voyage-Vers-Orion</adresse>
    <adresse>https://youtu.be/xCFg5udYbAg</adresse>
    <adresse>[https://youtu.be/xCFg5udYbAg]</adresse>
    <adresse><a href="https://youtu.be/xCFg5udYbAg" target="blank">[Film]</a></adresse>

  9. #9
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <![CDATA[http://www.....
    Résolu par le moteur du forum


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XML Schema] Assigner des attributs avec contrainte
    Par Rémaill dans le forum Valider
    Réponses: 2
    Dernier message: 31/07/2008, 10h34
  2. [LDAP] Modifier un attribut avec un ldif
    Par alex75 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 30/08/2006, 17h01
  3. Comment changer la valeur d'un attribut avec une stylesheet?
    Par BugsBunny dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 02/06/2006, 18h18
  4. [VB.net] Boucle for next avec un tableau
    Par grand_prophete dans le forum Windows Forms
    Réponses: 4
    Dernier message: 31/05/2006, 11h08
  5. Réponses: 6
    Dernier message: 19/12/2005, 15h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo