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

Interfaçage autre langage Python Discussion :

probleme avec writexml


Sujet :

Interfaçage autre langage Python

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 6
    Points : 6
    Points
    6
    Par défaut probleme avec writexml
    Bonjour,
    j'effectue un stage dans une entreprise et je suis entrain de me former au langage python. L'entreprise me contraint à utiliser la version 2.2.1.

    J'ai écrit un code qui permet de parser un xml, dans lequel sont stockés des personnes (principe du carnet d'adresse mais très simplifié). Mon premier fichier xml a été ecrit manuellement et il est parsé sans problème. Ensuite j'ai décider de créer de nouveaux objets Personnes qui seront stockés dans un deuxième fichier. Pour cela j'utilise la méthode writeXML. Le fichier est bien écrit sauf que quand je veux le lire le parse ne fonctionne plus. En réalité il fonctionne mais mes valeur de balises sont des chaînes vides.

    Le premier fichier xml : personnes.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
    <?xml version="1.0" ?>
    <quil>
        <personne>
            <nom>Durant</nom>
            <prenom>Stephan</prenom>
            <adresse>
                <ville>Bruxelles</ville>
            </adresse>
        </personne>
     
        <personne>
            <nom>Dupont</nom>
            <prenom>Henri</prenom>
            <adresse/>
        </personne>
    </quil>
    Mon application python : testDom.py
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    #!/usr/bin/env python
    #coding=utf-8
     
    from xml.dom.minidom import parse
    from xml.dom.minidom import Document
     
    class Adresse:
        ville = None
     
        def __init__(self):
            pass
     
     
    class Personne:
        nom = None
        prenom = None
        adresse = Adresse()
     
        def __init__(self):
            pass
     
    class XmlToPersonnes:
        __currentNode__ = None
        __personList__ = None
     
        def __init__(self, fichier):
            self.realXml(fichier)
     
        def realXml(self, fichier):
            self.doc = parse(fichier)
     
        def getRootElement(self):
            if self.__currentNode__ == None:
                self.__currentNode__ = self.doc.documentElement
            print str(self.__currentNode__)
            return self.__currentNode__
     
        def getPersonnes(self):
            if self.__personList__ != None:
                return
            self.__personList__ = []
            for personnes in self.getRootElement().getElementsByTagName("personne"):
                if personnes.nodeType == personnes.ELEMENT_NODE:
                    p = Personne()
                    print "nom = ",self.getText(personnes.getElementsByTagName("nom")[0])
                    try:
                        p.nom = self.getText(personnes.getElementsByTagName("nom")[0])
                        p.prenom = self.getText(personnes.getElementsByTagName("prenom")[0])
                        p.adresse = self.getAdresse(personnes.getElementsByTagName("adresse")[0])
                    except:
                        print "un des TAGS suivant est manquents : nom, prenom, adresse"
                    self.__personList__.append(p)
            return self.__personList__
     
        def getAdresse(self, node):
            adress = Adresse()
            try:
                adress.ville = self.getText(node.getElementsByTagName("ville")[0])
            except:
                adress.ville = None
            return adress
     
        def getText(self, node):
            return node.childNodes[0].nodeValue
     
    class PersonnesToXml:
        def __init__(self):
            self.doc = Document()
     
        def setPersonnes(self, personnes):
            quil = self.doc.createElement("quil")
            self.doc.appendChild(quil)
            for pers in personnes:
                personne = self.doc.createElement("personne")
                quil.appendChild(personne)
     
                nom = self.doc.createElement("nom")
                personne.appendChild(nom)
                nomText = self.doc.createTextNode(pers.nom)
                nom.appendChild(nomText)
     
                prenom = self.doc.createElement("prenom")
                personne.appendChild(prenom)
                prenomText = self.doc.createTextNode(pers.prenom)
                prenom.appendChild(prenomText)
     
                adresse = self.doc.createElement("adresse")
                personne.appendChild(adresse)
     
                ville = self.doc.createElement("ville")
                adresse.appendChild(ville)
                villeText = self.doc.createTextNode(pers.adresse.ville)
                ville.appendChild(villeText)  
     
        def sauvegarderXml(self):
            fichier = open("carnet.xml", "w")
            self.doc.writexml(fichier, "    ", "", "\n")
            fichier.close()
     
    if __name__ == "__main__":
            x = XmlToPersonnes("carnet.xml")
    #        x = XmlToPersonnes("personnes.xml")
            for personne in x.getPersonnes():
                print "*********************"
                print personne.nom
                print personne.prenom
                print personne.adresse.ville
                print "*********************"
            a1 = Adresse()
            a1.ville = "OSNY"
            p1 = Personne()
            p1.nom = "BROUARD"
            p1.prenom = "Bastien"
            p1.adresse = a1
     
            a2 = Adresse()
            a2.ville = "CERGY"
            p2 = Personne()
            p2.nom = "LESAGE"
            p2.prenom = "Olivier"
            p2.adresse = a2
     
            p3 = Personne()
            p3.nom = "RICHARD"
            p3.prenom = "Yoan"
            p3.adresse = a1
     
            listPersonnes = []
            listPersonnes.append(p1)
            listPersonnes.append(p2)
            listPersonnes.append(p3)
            ptx = PersonnesToXml()
            ptx.setPersonnes(listPersonnes)
            ptx.sauvegarderXml()
    Resultat du parsing de personnes.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
    > C:\tools\python2.2.1\python.exe -u "C:\Documents and Settings\g551918\Mes documents\MesProgrammesPython\testDom.py" 
    <DOM Element: quil at 10405040>
    nom =  Durant
    nom =  Dupont
    *********************
    Durant
    Stephan
    Bruxelles
    *********************
    *********************
    Dupont
    Henri
    None
    *********************
    Fichier xml généré par l'application : carnet.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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    <?xml version="1.0" ?>
        <quil>
        <personne>
        <nom>
        BROUARD
        </nom>
        <prenom>
        Bastien
        </prenom>
        <adresse>
        <ville>
        OSNY
        </ville>
        </adresse>
        </personne>
        <personne>
        <nom>
        LESAGE
        </nom>
        <prenom>
        Olivier
        </prenom>
        <adresse>
        <ville>
        CERGY
        </ville>
        </adresse>
        </personne>
        <personne>
        <nom>
        RICHARD
        </nom>
        <prenom>
        Yoan
        </prenom>
        <adresse>
        <ville>
        OSNY
        </ville>
        </adresse>
        </personne>
        </quil>
    Resultat du parsing de carnet.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
    25
    26
    27
    28
    29
    30
    31
    32
    > C:\tools\python2.2.1\python.exe -u "C:\Documents and Settings\g551918\Mes documents\MesProgrammesPython\testDom.py" 
    <DOM Element: quil at 10405272>
    nom =  
     
    nom =  
     
    nom =  
     
    *********************
     
     
     
     
     
     
    *********************
    *********************
     
     
     
     
     
     
    *********************
    *********************
     
     
     
     
     
     
    *********************
    Cependant j'ai pu observé qu'en indentant manuellement le fichier carnet.xml comme ceci :
    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" ?>
        <quil>
            <personne>
                <nom>BROUARD</nom>
                <prenom>Bastien</prenom>
                <adresse>
                    <ville>OSNY</ville>
                </adresse>
            </personne>
            <personne>
                <nom>LESAGE</nom>
                <prenom>Olivier</prenom>
                <adresse>
                    <ville>CERGY</ville>
                </adresse>
            </personne>
            <personne>
                <nom>RICHARD</nom>
                <prenom>Yoan</prenom>
                <adresse>
                    <ville>OSNY</ville>
                </adresse>
            </personne>
        </quil>
    Le parsing fonctionneme parfaitement :
    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
    > C:\tools\python2.2.1\python.exe -u "C:\Documents and Settings\g551918\Mes documents\MesProgrammesPython\testDom.py" 
    <DOM Element: quil at 10405336>
    nom =  BROUARD
    nom =  LESAGE
    nom =  RICHARD
    *********************
    BROUARD
    Bastien
    OSNY
    *********************
    *********************
    LESAGE
    Olivier
    CERGY
    *********************
    *********************
    RICHARD
    Yoan
    OSNY
    *********************
    Ma question est comment reussir à bien formatter le fichier xml en sortie ou bien faire en sorte que le parsing ne dépende pas du formatage ?

    PS : il m'est interdit de passer à la version supérieure de python

    Merci

  2. #2
    Futur Membre du Club
    Inscrit en
    Mars 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Désespérant de trouver une solution dans les librairies ou autres, j'ai fini par coder moi même la classe qui me permet de sauvegarder un dom dans un fichier XML avec une bonne indentation.

    Voici le code de cette classe :
    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
    #!/usr/bin/env python
    #coding=utf-8
     
    from xml.dom.minidom import parse
    from xml.dom.minidom import Document
    from xml.dom.minidom import Node
     
    class MyObjetsToXml:
     
        def __init__(self, doc):
            self.doc = doc
            self.chaineOut = '<?xml version="1.0" ?>'
     
        def genOutXml(self, currentNode, indent):
            self.chaineOut = self.chaineOut + "\n" + indent + "<" + currentNode.nodeName
            if currentNode.hasAttributes():
                for i in range(currentNode.attributes.length-1, -1, -1):
                    self.chaineOut = self.chaineOut + " "+currentNode.attributes.item(i).nodeName+'="'+currentNode.attributes.item(i).nodeValue+'"'
            self.chaineOut = self.chaineOut + ">"
            if currentNode.hasChildNodes():
                for balise in currentNode.childNodes:
                    textNode = False
                    if balise.nodeType == Node.ELEMENT_NODE:
                        self.genOutXml(balise, (indent+"\t"))
                    if balise.nodeType == Node.TEXT_NODE and balise.nodeValue.strip() != "" :
                        self.chaineOut = self.chaineOut + balise.nodeValue + "</" + currentNode.nodeName + ">"
                        textNode = True
                if textNode == False:
                    self.chaineOut = self.chaineOut +"\n"+indent+"</"+currentNode.nodeName+">"    
            else:
                self.chaineOut = self.chaineOut + "</"+ currentNode.nodeName+">"
     
        def sauvegarderXML(self, chemin):
            self.genOutXml(self.doc.documentElement, "\t")
            fichier = open(chemin, "w")
            fichier.write(self.chaineOut)
            fichier.close()
    J'espère que ça aidera les personnes ayant le même problème.

Discussions similaires

  1. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 10h33
  2. Problèmes avec le filtrage des ip
    Par berry dans le forum Réseau
    Réponses: 9
    Dernier message: 30/12/2002, 07h51
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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