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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    bm
    bm est déconnecté
    Membre extrêmement actif

    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
    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 confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    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 986
    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>';
        }
    }

  3. #3
    bm
    bm est déconnecté
    Membre extrêmement actif

    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
    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 extrêmement actif

    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
    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 confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    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 986
    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>';
        }
    }

  6. #6
    bm
    bm est déconnecté
    Membre extrêmement actif

    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
    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 !

+ 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