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 :

Récupération d'infos dans un XML [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert

    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Juin 2012
    Messages
    877
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2012
    Messages : 877
    Par défaut Récupération d'infos dans un XML
    Bonjour le Forum,

    Je bute sur un truc certainement très simple.

    Je vous explique.
    J'ai un XML de ce format
    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
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE cluster_config SYSTEM "cluster_config.dtd">
     <policy>
        <policy_name>test</policy_name>
            <policy_member>
                <sender>x</sender>
                <receiver>y</receiver>
             </policy_member>
           <policy_member>
                <sender>a</sender>
                <receiver>b</receiver>
             </policy_member>
           <policy_member>
                <sender>c</sender>
                <receiver>d</receiver>
               <receiver>e</receiver>
             </policy_member>
    </policy>

    Je peux avoir plusieurs policy_member et plusieurs sender/receiver par policy_member.

    Le but est de récupérer tous les sender/receiver par policy_member pour une policy donnée, ici toto.

    Mon code actuel :

    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
    # -*- coding: utf-8 -*-
     
     
    XmlFile = "C:\Test\test.xml"
    maPolicy = "test"
    #--------------------------------------------#
    import xml.etree.ElementTree as ET
     
    whitelist = {} 
     
    def get_policymember(filename, target_policyname): 
    	i = 1
    	policy_member = {}
    	print(type(policy_member))
    	tree = ET.parse(filename) 
    	for policy in tree.iter(tag = 'policy'):
    		policyname = policy.find('policy_name').text
    		if policyname == target_policyname: 
    			for var in policy.iter(tag = 'policy_member'):
    				for send in var.iter(tag = 'sender'):
    					listsend = []
    					sender = send.text
    					listsend.append(sender)
    					policy_member[i] = listsend
    					#print("Sender " + str(i) + " " + sender)
    				for receiv in var.iter(tag = 'receiver'):
    					receiver = receiv.text
    					#print("Receiver " + str(i) + " " + receiver)
    				i = i+1	
    				exit()
    	return 
     
     
    get_policymember(XmlFile, maPolicy)
     
    #print(type(whitelist))
    Je n'arrive pas récupérer les senders (les receivers seront récupérés de la même manière) dans le cas où ils sont plusieurs.

    Objectif d'affichage :
    {'1': [x] ,[y], "2" : [a], [b] , '3': [c], [d, e] }

    D'après les tests que j'ai fait :
    - soit je récupère tous les senders de tous les policy_members
    - soit j'écrase à chaque fois et je récupére qu'une seule valeur : seulement le receiver e et je perds le d.

    Pouvez-vous me guider svp ?

    MiistiK

  2. #2
    Membre expérimenté Avatar de zancrows
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2016
    Messages : 159
    Par défaut
    bonjour,

    j'aurais plutôt fait une liste de dictionnaire qui contient eux mêmes une liste pour les sender et receiver.
    en modifiant votre 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
     
    import xml.etree.ElementTree as ET
     
    def get_policymember(filename, target_policyname): 
        policy_member = []
        tree = ET.parse(filename) 
        for policy in tree.iter(tag = 'policy'):
            policyname = policy.find('policy_name').text
            if policyname == target_policyname: 
                for var in policy.iter(tag = 'policy_member'):
                    dic = {"sender": [], "receiver": []}
                    for send in var.iter(tag = 'sender'):
                        dic["sender"].append(send.text)
                    for send in var.iter(tag="receiver"):
                        dic["receiver"].append(send.text)
                    policy_member.append(dic)
        return policy_member
     
    def main():
        XmlFile = "D:\\Python\\test.xml"
        maPolicy = "test"
        for _ in  get_policymember(XmlFile, maPolicy):
            print(_)
     
    if __name__ == "__main__":
        main()
     
    # résultat:
    # {'sender': ['x'], 'receiver': ['y']}
    # {'sender': ['a'], 'receiver': ['b']}
    # {'sender': ['c'], 'receiver': ['d', 'e']}

  3. #3
    Membre Expert

    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Juin 2012
    Messages
    877
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2012
    Messages : 877
    Par défaut
    Bonjour,

    Merci, ça fait le boulot.



    Je ne comprends pas cette partie, pouvez-vous détailler svp ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def main():
        XmlFile = "D:\\Python\\test.xml"
        maPolicy = "test"
        for _ in  get_policymember(XmlFile, maPolicy):
            print(_)
     
    if __name__ == "__main__":
        main()
    Pourquoi faire un main ?

    Que signifie for _ in ?

    Je ne comprends pas le if.

    MiistiK

  4. #4
    Membre expérimenté Avatar de zancrows
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2016
    Messages : 159
    Par défaut
    Citation Envoyé par Miistik Voir le message
    Pourquoi faire un main ?
    La fonction main() n'est pas du tout obligatoire c'est juste que je rédige mes scripts de cette façon.

    Citation Envoyé par Miistik Voir le message
    Que signifie for _ in ?
    Le _ c'est juste le nom de la variable j'aurais pu mettre toto, foo, a ,b ou c etc...

    Citation Envoyé par Miistik Voir le message
    Je ne comprends pas le if.
    Enfin pour la condition ce n'est pas aussi obligatoire, cela signifie juste que le code qui est placé dedans sera exécuté que si c'est bien ce script qu'on exécute.
    Par contre si on importait ce code la partie sous la condition ne le serait jamais.

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Juin 2012
    Messages
    877
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2012
    Messages : 877
    Par défaut
    Citation Envoyé par zancrows Voir le message
    La fonction main() n'est pas du tout obligatoire c'est juste que je rédige mes scripts de cette façon.
    D'accord, je pourrais tout aussi bien déclarer mes variables et appeler ma fonction sans.

    Le _ c'est juste le nom de la variable j'aurais pu mettre toto, foo, a ,b ou c etc...
    Vu comme ça, j'ai l'air bête.

    Enfin pour la condition ce n'est pas aussi obligatoire, cela signifie juste que le code qui est placé dedans sera exécuté que si c'est bien ce script qu'on exécute.
    Par contre si on importait ce code la partie sous la condition ne le serait jamais.
    Comment ça ?
    Cela signifie que si je copie le main et le if dans un autre script, le script ne s'éxécuterait pas ?

  6. #6
    Membre expérimenté Avatar de zancrows
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2016
    Messages : 159
    Par défaut
    voici un petit exemple j'ai deux fichiers:

    poc_2.py

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    def add(a, b):
        return a + b
     
    print(add(1, 2))
    print(add(3, 2))
    print(add(-1, 2))
    et poc.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    import poc_2
     
    print("hello world")
    si j'exécute poc.py voilà le résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    3
    5
    1
    hello world
    maintenant je modifie le fichier poc_2.py avec ma condition:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    def add(a, b):
        return a + b
     
    if __name__ == "__main__":    
        print(add(1, 2))
        print(add(3, 2))
        print(add(-1, 2))
    et que j'exécute de nouveau poc.py voilà le résultat:

    j'espère t'avoir un peu éclaircie ^^ sinon je ne peux que t'inviter à essayer par toi même ce petit exemple en le modifiant pour mieux comprendre

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

Discussions similaires

  1. [windev XI] Recuperation des infos dans un xml
    Par nemosfib dans le forum WinDev
    Réponses: 2
    Dernier message: 25/03/2008, 16h27
  2. [Structure] stocker infos dans fichier xml?
    Par cortex024 dans le forum XML/XSL et SOAP
    Réponses: 7
    Dernier message: 05/02/2007, 16h39
  3. [AJAX] Récupérer infos dans fichier XML
    Par Dia_FR dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 02/12/2006, 15h34
  4. Récupération de properties dans un XML
    Par anitshka dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 08/06/2006, 15h59
  5. [FLASH] comment rechercher l'info dans un XML
    Par hatice83 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 14/12/2005, 11h57

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