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

Python Discussion :

Boucle balises Xml


Sujet :

Python

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 116
    Points : 61
    Points
    61
    Par défaut Boucle balises Xml
    Bonjour,

    J'ai un fichier xml que voici :

    Code XML : 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
    <?xml version="1.0" encoding="UTF-8"?>
    <BDDPoint>
    	<point id="1">
    		<coordonnees x="1.2" y="2.3" z="0.75" >
    			<parametres>
    				<Color Couleur="Blue"/>
    				<size Taille="2"/>
    				<transparency Transparence="0.5"/>
    			<parametres/>
    		</coordonnees>
    	</point>
     
    	<point id="2">
    		<coordonnees x="1.5" y="1.3" z="0.0">
    			<parametres>
    				<Color Couleur="Red"/>
    				<size Taille="3" />
    				<transparency Transparence="0.2"/>
    			<parametres/>
    		</coordonnees>
    	</point>
     
    	<point id="3">
    		<coordonnees x="4" y="3.1" z="1.6">
    			<parametres>
    				<Color Couleur="Green"/>
    				<size Taille="4" />
    				<transparency Transparence="0.8"/>
    			<parametres/>
    		</coordonnees>
    	</point>
     
    </BDDPoint>

    J'essaye de créer une boucle pour récupérer toutes les balises et leurs attributs dans chaque balise "point".
    Voici la boucle de mon code :

    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
    cptPoint = 0
     
    for point in tree.xpath("/BDDPoint/point"):
        cptPoint = cptPoint + 1
     
        id = point.get("id")
     
        cptCoordonnees = 0
     
        for coordonnees in tree.xpath("/BDDPoint/point/coordonnees"):
            cptCoordonnees = cptCoordonnees + 1
     
            if cptCoordonnees == cptPoint:
                x = point.get("x")
                y = point.get("y")
                z = point.get("z")
     
            cptCouleur = 0
            cptSize = 0
            cptTransparence = 0
     
            for Param in tree.xpath("/BDDPoint/point/coordonnees/parametres/Color"):
                cptCouleur = cptCouleur + 1
     
                if cptCouleur == cptCoordonnees:
                    color = point.get("Couleur")
     
            for Param in tree.xpath("/BDDPoint/point/coordonnees/parametres/size"):
                cptSize = cptSize + 1
     
                if cptSize == cptCoordonnees:
                    size = point.get("size")
    Cette méthode n'est pas simple et optimisée car à chaque fois il faut que je reboucle sur les balises pour récupérer les autres balises ce qui complexifie vachement la chose... Ce que je souhaite c'est d'avoir une méthode qui boucle sur toutes les balises du Point1, puis du Point2 et ensuite du 3. Or, dans mon code, je boucle d'abord sur le Point pour récupérer l'id, puis ensuite je recréer une autre boucle pour boucler les coordonnées etc...
    Merci pour votre aide!

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 277
    Points : 36 762
    Points
    36 762
    Par défaut
    Salut,

    Citation Envoyé par nivk-539 Voir le message
    Ce que je souhaite c'est d'avoir une méthode qui boucle sur toutes les balises du Point1, puis du Point2 et ensuite du 3. Or, dans mon code, je boucle d'abord sur le Point pour récupérer l'id, puis ensuite je recréer une autre boucle pour boucler les coordonnées etc..
    Normalement, le "point" fabriqué par for point in tree.xpath("/BDDPoint/point") est un sous arbre. Il suffit d'en extraire les informations que vous voulez (sans repasser par la racine).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Invité
    Invité(e)
    Par défaut
    Moi je ferais ça à l'ancienne si la structure de ton xml est toujours la même...
    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
    import re
    file = open('todel.xml','r')
    txt = file.read()
    file.close()
    dico = {}
    pattern = '"(.*?)"'
    liste = re.findall(pattern ,txt[39:])
    ind = 0
    for obj in liste:
        if ind % 7 == 0 :
            id = obj
            coord = (liste[ind+1],liste[ind+2],liste[ind+3])
            color = liste[ind+4]
            size = liste[ind+5]
            transparency = liste[ind+6]
            print('ID :',id,', Coord :',coord,', Color :',color,', Size :',size,', Transparency :',transparency)
        ind+=1
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ID : 1 , Coord : ('1.2', '2.3', '0.75') , Color : Blue , Size : 2 , Transparency : 0.5
    ID : 2 , Coord : ('1.5', '1.3', '0.0') , Color : Red , Size : 3 , Transparency : 0.2
    ID : 3 , Coord : ('4', '3.1', '1.6') , Color : Green , Size : 4 , Transparency : 0.8

  4. #4
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    hello,
    tout d'abord, tu nous as mis un piège dans ton fichier xml : tu as des balises auto-fermantes sur la balise paramètres (<parametres/> ) alors que tu l'utilises sur plusieurs lignes.
    xml correct :
    Code XML : 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
    <?xml version="1.0" encoding="UTF-8"?>
    <BDDPoint>
        <point id="1">
            <coordonnees x="1.2" y="2.3" z="0.75" >
                <parametres>
                    <Color Couleur="Blue"/>
                    <size Taille="2"/>
                    <transparency Transparence="0.5"/>
                </parametres>
            </coordonnees>
        </point>
     
        <point id="2">
            <coordonnees x="1.5" y="1.3" z="0.0">
                <parametres>
                    <Color Couleur="Red"/>
                    <size Taille="3" />
                    <transparency Transparence="0.2"/>
                </parametres>
            </coordonnees>
        </point>
     
        <point id="3">
            <coordonnees x="4" y="3.1" z="1.6">
                <parametres>
                    <Color Couleur="Green"/>
                    <size Taille="4" />
                    <transparency Transparence="0.8"/>
                </parametres>
            </coordonnees>
        </point>
     
    </BDDPoint>

    voici une solution possible à ton problème en utilisant lxml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from lxml import etree
    tree= etree.parse('bddpoint.xml')
    for point in tree.xpath("//point"):
        id = point.get("id")
        print("id : " + id)
        for coord in point:
            print (coord.tag, coord.attrib)
            for param in coord:
                print(param[0].tag, param[0].attrib )
                print(param[1].tag, param[1].attrib )
                print(param[2].tag, param[2].attrib )
                #print(param[2].attrib["Transparence"])  pour afficher la valeur de l'attribut Transparence
    voici le résultat :
    [python36]>>> id : 1
    coordonnees {'x': '1.2', 'y': '2.3', 'z': '0.75'}
    Color {'Couleur': 'Blue'}
    size {'Taille': '2'}
    transparency {'Transparence': '0.5'}
    id : 2
    coordonnees {'x': '1.5', 'y': '1.3', 'z': '0.0'}
    Color {'Couleur': 'Red'}
    size {'Taille': '3'}
    transparency {'Transparence': '0.2'}
    id : 3
    coordonnees {'x': '4', 'y': '3.1', 'z': '1.6'}
    Color {'Couleur': 'Green'}
    size {'Taille': '4'}
    transparency {'Transparence': '0.8'}
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 116
    Points : 61
    Points
    61
    Par défaut
    Merci à tous mais la solution de jurassic_pork me convient le mieux 🙂

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par nivk-539 Voir le message
    Merci à tous mais la solution de jurassic_pork me convient le mieux 🙂
    Encore raté caramba !

Discussions similaires

  1. [XML][XSL]probleme html dans balise xml
    Par chateau64 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 02/12/2005, 11h42
  2. [XML] string et balise XML <??>
    Par Royd938 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 24/10/2005, 16h51
  3. [Configuration] Confusion de balises XML / PHP
    Par teto dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 10/09/2005, 13h40
  4. [JDOM] données un attribut à une balise xml
    Par noobiewan kenobi dans le forum Format d'échange (XML, JSON...)
    Réponses: 11
    Dernier message: 09/07/2004, 15h54
  5. [Balise XML] Comment récupérer le contenu entre 2 balise?
    Par ZoumZoumMan dans le forum C++Builder
    Réponses: 5
    Dernier message: 05/03/2004, 16h36

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