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 :

[XML] comment récuperer le contenu des balises


Sujet :

Python

  1. #1
    Membre du Club
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut [XML] comment récuperer le contenu des balises
    Bonjour étant un novice en matiere de langage python je me permet de vous demander conseille par rapport a un de mes exerices :

    Le but de cet exercice est d'extraire le contenu de differentes balises et de stocker tous cela dans un tableau pour etre réutiliser:

    <Profil>
    <Nom>1092</Nom>
    <Age>40</Age>
    <Type>1</Type>
    <Date>1998-01-23</Date>
    <Pays>France</Pays>
    </Profil>


    apres avoir regarder sur le forum j'ai trouver differents moyen de "transformer " ce fichier XML ( minimob ,ElementTree, etc...) et donc je voulais avoir votre avis sur la solutions qui correspondrai le mieux avec mon probleme ?

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Par défaut
    Bonjour,

    Personnellement j'utilise minidom pour faire ce genre de chose.
    Voici un exemple tout simple pour récupérer les données dans un dictionnaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    from xml.dom.minidom import parse
     
    dom = parse('file.xml')
    root = dom.documentElement
    dictXml = {}
    for node in root.childNodes:
        if node.nodeType != node.TEXT_NODE:
            name = node.nodeName
            value = node.firstChild.nodeValue
            dictXml[name] = value
     
     
    print dictXml

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    ElementTree c'est bien aussi et c'est plus "pythonique" je trouve:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> from xml.etree.ElementTree import ElementTree
    >>> tree = ElementTree(file=open("file.xml"))
    >>> [child.text for child in tree.getroot()]
    ['1092', '40', '1', '1998-01-23', 'France']
    >>> dict((e.tag, e.text) for e in tree.getroot())
    {'Date': '1998-01-23', 'Nom': '1092', 'Age': '40', 'Type': '1', 'Pays': 'France'}
    [OT] "minimob" c'est mignon [/OT]

  4. #4
    Membre du Club
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut
    j'ai éssayer vos deux solutions elle fonctionne parfaitement pour mon premier probleme, mais j'ai fait une petit erreur d'explication:

    en faite je récupère une liste de profil au format xml que je doit classer comme précédemment, mais je ne connais pas le contenu des balises (Nom,Age,Type,Date,Pays) et il y a plus de balise 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
    17
    18
    19
    20
    21
    22
    23
    24
     
    <?xml version="1.0" standalone="yes"?>
    <Classe>
      <Profil>
        <Nom>1092</Nom>
        <Age>40</Age>
        <Type>1</Type>
        <Date>1998-01-23</Date>
        <Pays>France</Pays>
      </Profil>
      <Profil>
        <Nom>1092</Nom>
        <Age>40</Age>
        <Type>1</Type>
        <Date>1998-01-23</Date>
        <Pays>France</Pays>
      </Profil>
      <Profil>
          .
          .
          .
          .
      </Profil>
    </Classe>
    désoler pour cette petite erreur
    et merci pour la petite correction de "minimob".

  5. #5
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Bonjour,
    tu peux jeter un oeil ici pour un exemple simple de noeuds imbriqués.

  6. #6
    Membre du Club
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut
    merci beaucoup , apparement j'avais pas assez cherché.

    bonne continuation

  7. #7
    Membre du Club
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut
    merci pour le lien mais celui ci traite plutot des recherche de nombre mais dans mon cas les balises peuvent contenir du texte , je ne sais pas si cela fonctionne de la meme façon deplus je ne connais pas d'avance les valeurs entre les differentes balises ??

  8. #8
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Il faut chercher un peu... Voici un début de piste. J'espère que je ne suis pas en train de résoudre un problème donné par un prof...
    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
    #! /usr/bin/env python
    #coding=utf-8
     
    import xml.etree.ElementTree as etree
    tree = etree.parse('xml_doc.xml')
    root = tree.getroot()
     
    def findText(node):
        for child in node:
            print'TAG : '+ child.tag
            if child.text.strip():
                print('TEXT : ' + child.text.strip())
            findText(child)
     
    findText(root)
    xml_doc.xml est le nom donné au fichier xml.

    La méthode ci-dessus ne fonctionne pas si le texte contient un caractère non ascii.

  9. #9
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Salut

    Si vous y avez droit, le xpath peut vous aider
    Voici quelques expressions qui vont bien dans votre cas:

    1. Sélectionner tous les noeuds textes qui contiennent autre chose que des espaces.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //*[normalize-space(text()) != ""]/text()
    2. Sélectionner tous les noeuds textes des fils de Classe/Profil
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /Classe/Profil/*/text()

    Et voici enfin comment s'en servir en Python. Cet exemple utiliise libxml2.
    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
    >>> import libxml2
    >>> doc = libxml2.parseFile("NewFile.xml")
    >>> ctx = doc.xpathNewContext()
    >>> result = ctx.xpathEval("/Classe/Profil/*/text()")
    >>> for node in result:
    ...     print node
    ... 
    1092
    40
    1
    1998-01-23
    France
    1092
    40
    1
    1998-01-23
    France
    >>> doc.freeDoc()
    >>> ctx.xpathFreeContext()
    N.B. : N'oubliez pas les deux dernières lignes qui servent à libérer la mémoire allouée. Pas très pythonique, mais soit...

  10. #10
    Membre du Club
    Inscrit en
    Mai 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 7
    Par défaut
    Citation Envoyé par rambc Voir le message
    Il faut chercher un peu... Voici un début de piste. J'espère que je ne suis pas en train de résoudre un problème donné par un prof...
    Non ne t'inquiete pas ce sont des exercices q'un copain ma passer pour m'initier au python.


    Sinon merci pour toutes c'est reponses cela ma bien aider.

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

Discussions similaires

  1. modifier le contenu des balises d'un document XML
    Par habsbu dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 19/06/2011, 09h52
  2. [XSLT] lire le contenu des balises en xml dans un ordre précis
    Par ajax12 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 08/04/2010, 18h47
  3. XML contenu des balises pour des images
    Par boitalette dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 18/10/2009, 18h36
  4. Extraire le contenu des balises XML
    Par calimero2611 dans le forum Modules
    Réponses: 7
    Dernier message: 12/06/2006, 15h09
  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