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 :

Lecture XML et recuperation d'elements [Python 3.X]


Sujet :

Python

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur de Production
    Inscrit en
    Mai 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de Production
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2009
    Messages : 58
    Par défaut Lecture XML et recuperation d'elements
    Bonjour

    Je commence a me mettre un peu a Python, et la je suis sur un script pour essayer de lire les données d'un fichier xml pour en extraire des données.

    J'arrive a charger le xml, mais je n'arrive pas a extraire mes valeurs
    en fait, le soucis est que mon xml n'est pas tres standard.

    au lieu d'avoir des données type <balise>valeur</balise>
    mes données sont sous la forme <balise V="valeur">

    du coup je ne comprend pas trop comment les recuperer.
    pour le moment j'ai juste essayer avec import xml.etree.ElementTree as ET pour importer et lire mon fichier, mais peut etre dois-je utiliser un autre module ?

    je cherche a extraire les données des Employes seulement.

    exemple de mon xml
    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
     
    <Employeur>
     <Nom V="entreprise truc">
     <Adresse V="rue machin">
    </Employeur>
    <Employes>
     <Employe>
      <nom V="Blagun">
      <prenom V="Jean">
      <Status V="interimaire">
      <NIR V="1234578969325851">
     </Employe>
     <Employe>
       ...
     </Employe>
    </Employes>

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Salut,
    Citation Envoyé par Chico008 Voir le message
    au lieu d'avoir des données type <balise>valeur</balise>
    mes données sont sous la forme <balise V="valeur">
    Dans <balise>valeur</balise> "valeur" sera text de l'élément "balise" alors que dans la forme <balise V="valeur"> "valeur" est valeur de l'attribut "V" associé à l'élément "balise".

    Dans la documentation de xml.etree.ElementTree, vous avez des exemples qui montrent comment récupérer les informations pour ces différents éléments.

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

  3. #3
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 978
    Par défaut
    Attention, tel qu'il est inscrit ce XML ne se chargera jamais.
    Il manque la racine et il manque la fermeture des balises.
    Soit c'est <balise>valeur</balise>, soit c'est <balise attribut="valeur"/>

    Un petit exemple basique, même s'il existe d'autres solutions.
    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
    import xml.etree.ElementTree as ET
     
    xml = """<Data>
     <Employeur>
     <Nom V="entreprise truc"/>
     <Adresse V="rue machin"/>
    </Employeur>
    <Employes>
     <Employe>
      <nom V="Blagun"/>
      <prenom V="Jean"/>
      <Status V="interimaire"/>
      <NIR V="1234578969325851"/>
     </Employe>
     <Employe>
      <nom V="Toto"/>
      <prenom V="TOTO"/>
      <Status V="test"/>
      <NIR V="123"/>
     </Employe>
    </Employes>
    </Data>
    """
     
    root = ET.fromstring(xml)
    employees = root.find("Employes")
    for employee in employees.findall("Employe"):
        name = employee.find("nom").attrib["V"]
        print(name)

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur de Production
    Inscrit en
    Mai 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de Production
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2009
    Messages : 58
    Par défaut
    J'ai pas de balise <data> mais une autre balise avec un autre nom au début de fichier, qui se termine a la fin du fichier par son équivalent </>
    faut obligatoirement que ce soit <data> ? ca peut pas être autre chose ?
    actuellement dans le fichier originel c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <n:Documents n="valeur">
    et un à la fin
    le fichier provient d'un progiciel sur lequel je n'ai pas la main pour modifier la facon dont le fichier est généré.

    Mes données sont bien en <Nom V="valeur"/>, dsl pour l'erreur de recopie >_<

    J'avais lu la documentation de xml.etree.ElementTree, mais sans trouver ce qui pouvait correspondre à mon besoin.

    Du coup actuellement j'essaie ce script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    import xml.etree.ElementTree as ET
     
    #fichier XML a lire
    xml_file="C:/temps/data.xml"
     
    root = ET.parse(xml_file)
     
    #on parcours les données et on extrait ce qui nous interesse
    data=root.find("Employes")
    for agents in data.findall("Employe"):
        nom=agents.find("Nom").attrib["V"]
        print(nom)
    J'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    nom=agents.find("Nom").attrib["V"]
    AttributeError: 'NoneType' object has no attribute 'attrib'

  5. #5
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 978
    Par défaut
    J'ai mis "Data" parce que c'est qui m'est venu à l'esprit en premier.
    J'aurait pu aussi l'appeler "Root", le nom n'a pas d'importance.

    L'erreur que tu obtiens est normale si on se fie au XML que tu fournis.
    agents.find("Nom") renvoie None puisque dans ton XML c'est "nom" (sans majuscule).
    Et None n'a pas de membre nommée "attrib".

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur de Production
    Inscrit en
    Mai 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de Production
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2009
    Messages : 58
    Par défaut
    oui pardon, de mon coté je test avec les données réel et dans mon fichier d'origine c'est bien <Nom V="nom"/>
    Je respecte bien la casse de mon coté, dsl de pas coller direct un bout du fichier ici car ce sont des données personnelles.

    edit : Ok résolu, j'ai aussi une subtilité c'est que des données de la personne sont dans une sous balide de employe dans mon fichier, du coup le find("Nom") marche pas car c'etait dans une sous balise agents, mais avec un fond("agent/Nom") ca fonctionne.
    je pensais que le find cherchait aussi dans les sous arborescences

    Merci pour votre aide, surtout pour la partie attrib (^^)b

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 067
    Par défaut
    Hello,

    Pour rendre votre code plus robuste, je vous suggère d'utiliser la méthode get() pour récupérer la valeur de l'attribut. L'avantage est que si l'attribut "V" n'existe pas, cela retournera None au lieu de lever une erreur. Exemple d'utilisation : element.attrib.get("V")
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/12/2019, 10h31
  2. Avis sur ma structure XML et récupération des éléments
    Par fullmetalkeke dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 02/05/2013, 16h25
  3. [DOM XML] Récupérer un élément
    Par goddet dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 05/03/2007, 16h11
  4. [ASP][DOM] Récupérer les éléments d'un XML
    Par Tikate dans le forum XML/XSL et SOAP
    Réponses: 7
    Dernier message: 03/05/2006, 11h51
  5. Récupération des éléments d'un fichier xml en flux retour
    Par opeo dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 07/11/2005, 10h33

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