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 :

parser un fichier XML ligne par ligne


Sujet :

Python

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 297
    Par défaut parser un fichier XML ligne par ligne
    Bonjour
    j'ai un fichier xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8"?>
    <livre>
    	<Information>	
    		<newLivre nom="livre1" date=132>
    		<newLivre nom="livre2" date=133>
    	</Information>
     
    	<auteur>
    		<infoAuteur nom="auteur1" date=1960>
    		<infoAuteur nom="auteur2" date=1970>	
    	<auteur>
    </livre>
    j'aimerais le parser pour afficher juste les informations (livre1, livre 2 et les date et les noms des auteurs
    j'ai ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def lireFichier(path):
            fichier = open("C:\fichier.xml")
            ligne = fichier.readline()
            ligne = ligne.strip()
            print ligne
            #return ligne
            fichier.close()
    mais en appelant la fonction , j'ai que la première ligne qui s'affiche <?xml version="1.0" encoding="UTF-8"?>
    vous avez une idée ?

  2. #2
    Membre très actif
    Homme Profil pro
    dev
    Inscrit en
    Avril 2011
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : dev
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 174
    Par défaut
    a mon avis, il faut plutôt utiliser les modules pour parser des fichier xml, et a mon avis ya meme des tutoriels sur sa,

  3. #3
    Membre très actif
    Homme Profil pro
    dev
    Inscrit en
    Avril 2011
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : dev
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 174
    Par défaut
    http://quilovnic.developpez.com/pythondom/

    Voici un bon document pour sa, vous devez trouver se que vous cherchez

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 297
    Par défaut
    merci j'ai vu cet exemple
    mais on n'affiche qu'un seul nom dans l'exemple , on peut pas afficher tous les noms (durant , dupont etc )

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 770
    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 770
    Par défaut
    Salut,

    Citation Envoyé par nancy maman Voir le message
    merci j'ai vu cet exemple
    mais on n'affiche qu'un seul nom dans l'exemple , on peut pas afficher tous les noms (durant , dupont etc )
    Il faut penser "arbre":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	<Information>	
    		<newLivre nom="livre1" date=132>
    		<newLivre nom="livre2" date=133>
    	</Information>
    Information a pour fils deux éléments de type newLivre qui ont pour attributs...
    Côté code, l'API la plus sympa serait:
    tree = lecture du fichier,
    for node in tree:
    for e in node:
    Et c'est ce que proposent LXML ou elementtree.
    Cordialement
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 297
    Par défaut
    j'ai testé ce 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
     
    document = """\
    <quil>
     
        <personne>
     
            <nomPrenom nom="Durant" prenom="Stephan">
            </nomPrenom>
            <nomPrenom nom="a" prenom="b">
            </nomPrenom>
     
        </personne>
        
        <personne>
     
            <nomPrenom nom="d" prenom="e">
            </nomPrenom>
            <nomPrenom nom="f" prenom="g">
            </nomPrenom>
     
        </personne>
     
        
     
    </quil>
    """
     
    from xml.dom import minidom                                          
    dom = minidom.parseString(document)
     
    def getText(nodelist):
        rc = ""
        for node in nodelist:
            if node.nodeType == node.TEXT_NODE:
                rc = rc + node.data
        return rc
     
    def handleSlideshow(quil):
     
        racines = quil.getElementsByTagName("personne")
        handleSlides(racines)
     
     
    def handleSlides(racines):
        for personne in racines:
            handleSlide(personne)
     
    def handleSlide(personne):
        handleNom(personne.getElementsByTagName("nomPrenom")[0])
     
     
    def handleNom(nom):
        print  "nom : "+getText(nom.childNodes)
     
    def handlePrenom(personnes):
     
        for prenom in personnes:
            print "prenom : "+getText(prenom.childNodes)
     
     
     
     
    handleSlideshow(dom)
    mais il me renvoie rien comme résultat

  7. #7
    Membre émérite
    Homme Profil pro
    Ingénieur R&D en apprentissage statistique
    Inscrit en
    Juin 2009
    Messages
    447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur R&D en apprentissage statistique

    Informations forums :
    Inscription : Juin 2009
    Messages : 447
    Par défaut
    C'est parce que l'information que tu cherches ne se trouve pas dans un noeud text mais dans un attribut de la balise nomPrenom.

    Cela marcherait (à quelques modifications près) si ton code xml était de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <quil>
     
        <personne>
            <nom>Durant</nom>
            <prenom>Stéphane</prenom>
        </personne>
     
        <personne>
            <nom>d</nom>
            <prenom>e</prenom>
        </personne> 
    </quil>
    Dans ce cas l'information voulue est bien dans un TextNode.

    Au passage ton code xml d'exemple n'est pas très cohérent (pourquoi y a-t-il) deux balises nomPrenom par personne ?). Puisque tu n'as pas de donnée fille dans la balise nomPrenom une balise auto-fermante est suffisante et il faut utiliser la méthode getAttribute pour accéder à l'information souhaitée :

    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
    document = """\
    <quil>
        <personne>
            <nomPrenom nom="Durant" prenom="Stephane" />
        </personne>
        <personne>
            <nomPrenom nom="d" prenom="e" /> 
         </personne>
    </quil>
    """
     
    from xml.dom import minidom                                          
    dom = minidom.parseString(document)
     
    def getText(nodelist):
        rc = ""
        for node in nodelist:
            if node.nodeType == node.TEXT_NODE:
                rc = rc + node.data
        return rc
     
    def handleSlideshow(quil):
     
        racines = quil.getElementsByTagName("personne")
        handleSlides(racines)
     
     
    def handleSlides(racines):
        for personne in racines:
            handleSlide(personne)
     
    def handleSlide(personne):
        handleNom(personne.getElementsByTagName("nomPrenom")[0])
     
     
    def handleNom(nom):
        print  "nom : "+ nom.getAttribute("nom")
     
    handleSlideshow(dom)

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 297
    Par défaut
    en effet je voulais donné un exemple qui ressemble un ma structure xml, car j'ai des indices qui correspondent à chaque personne
    maintenant si j’applique ton code avec cette structure pour afficher aussi les prenoms et les indices (nome et type) ca fonctionne plus
    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
     
    document = """\
    <quil>
     
        <personne>
     
            <nomPrenom nom="Durant" prenom="Stephan">
                <indice nome="1" type="1"/>
                <indice nome="2" type="2"/>
                
            </nomPrenom>
            
     
        </personne>
        
        <personne>
     
            <nomPrenom nom="d" prenom="e">
            </nomPrenom>
            
     
        </personne>
     
        
     
    </quil>
    """

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 297
    Par défaut
    pour les prénoms je l'ai fais , il suffit de rajouter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     handlePrenom(personne.getElementsByTagName("nomPrenom")[0])
    def handlePrenom(prenom):
        print  "prenom : "+ prenom.getAttribute("prenom")
    mais pour les indices ?!

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 297
    Par défaut
    mais je peux aussi déclaré une seule balise personne
    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
    document = """\
    <quil>
        <personne>
            <nomPrenom nom="Durant" prenom="Stephane" />
                    <indice nome="1" type="1"/>
                   <indice nome="2" type="2"/>
            <nomPrenom nom="d" prenom="e" /> 
         </personne>
    </quil>
    """
     
    from xml.dom import minidom                                          
    dom = minidom.parseString(document)
     
    def getText(nodelist):
        rc = ""
        for node in nodelist:
            if node.nodeType == node.TEXT_NODE:
                rc = rc + node.data
        return rc
     
    def handleSlideshow(quil):
     
        racines = quil.getElementsByTagName("personne")
        handleSlides(racines)
     
     
    def handleSlides(racines):
        for personne in racines:
            handleSlide(personne)
     
    def handleSlide(personne):
        handleNom(personne.getElementsByTagName("nomPrenom")[0])
     
     
    def handleNom(nom):
        print  "nom : "+ nom.getAttribute("nom")
     
    handleSlideshow(dom)
    dans ce cas il n'affiche plus que le premier nom pas le deuxième et c'est normal car il faut une boucle sur le "nomPrenom" et non pas sur la "personne" mais quand je le fais il m'affiche plein de message d'erreur

  11. #11
    Membre émérite
    Homme Profil pro
    Ingénieur R&D en apprentissage statistique
    Inscrit en
    Juin 2009
    Messages
    447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur R&D en apprentissage statistique

    Informations forums :
    Inscription : Juin 2009
    Messages : 447
    Par défaut
    Je pense qu'il serait préférable que tu nous montre un exemple des vrais données que tu as a traiter parce que là tu changes tes exemples à chaque fois, ça devient confus.

    Je repars donc de ton exemple xml du tout début avec quelques corrections dans le code xml pour qu'il soit valide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8"?>
    <livre>
    	<Information>	
    		<newLivre nom="livre1" date="132" />
    		<newLivre nom="livre2" date="133" />
    	</Information>
     
    	<auteur>
    		<infoAuteur nom="auteur1" date="1960" />
    		<infoAuteur nom="auteur2" date="1970" />	
    	</auteur>
    </livre>
    Je te conseille l'utilisation de elementree qui est plus facile d'utilisation que le DOM:

    Pour faire ce que tu demandes (mais est-ce ce que tu veux ?):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import xml.etree.ElementTree as ET
     
     
    def parse_file(path):
        root = ET.parse(path).getroot()
        print "Information"
        for newLivre in root.findall("Information/newLivre") :
            print u"nom : %s; date : %s"%(newLivre.attrib["nom"],newLivre.attrib["date"])
        print "Auteurs"
        for infoAuteur in root.findall("auteur/infoAuteur") :
            print u"nom : %s; date : %s"%(infoAuteur.attrib["nom"],infoAuteur.attrib["date"])
     
    if __name__ == '__main__' :
        parse_file("livre.xml")

Discussions similaires

  1. Parser un fichier xml sur une ligne
    Par lokomass dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 27/02/2015, 17h37
  2. [DOM] Parser un fichier xml (sans espaces et retours à la ligne)
    Par rizki1 dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 04/05/2010, 10h26
  3. [debutant]lecture fichier ligne par ligne
    Par Battosaiii dans le forum C
    Réponses: 2
    Dernier message: 13/11/2005, 19h02
  4. lire un fichier ligne par ligne
    Par peuf23 dans le forum C
    Réponses: 6
    Dernier message: 21/09/2005, 10h43

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