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 Ecriture XML avec données unicode


Sujet :

Python

  1. #1
    Membre actif Avatar de Rupella
    Inscrit en
    Février 2005
    Messages
    286
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 286
    Points : 257
    Points
    257
    Par défaut Lecture Ecriture XML avec données unicode
    Bonjour,

    J'ai un fichier XML, encodé en windows-1256, parce qu'il contient des données en arabe.
    J'essaye de lire le contenu du fichier, d'en modifier quelques données, et d'écrire le résultat.

    Le script python que j'utilise ressemble à cela :

    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
    # -*- coding:Latin-1 -*-
    import re
    from xml.dom import minidom
     
    xmldoc = minidom.parse("d:\\exemple.xml")
    xmlTrames = xmldoc.getElementsByTagName("p")
     
    # Récupération des données en provenance du XML
    data = xmlTrames[0].firstChild.data
     
    # On réinjecte dans le stream XML
    new_data = data
    xmlTrames[0].firstChild.data = new_data
     
    fic_xml = open("d:\\exemple.xml", "w")
    fic_xml.write(xmldoc.toxml())
    fic_xml.close()
    Le fichier XML utilisé est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?xml version="1.0" encoding="windows-1256" ?> 
    - <Items>
    - <Item>
      <p>لا شيء</p> 
      </Item>
      </Items>
    A celà, deux problèmes :

    1 - J'ai une erreur lors de l'écriture du fichier du type : "UnicodeEncodeError : 'ascii' codec can't encode characters in position 52-53 : ordinal not in range (128)

    2 - Y a-t-il une meilleure manière de procéder pour répercuter les modifications qu'un fichier XML aura subi après traitement des données ?

    Merci pour toute votre attention.

  2. #2
    Membre actif Avatar de Rupella
    Inscrit en
    Février 2005
    Messages
    286
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 286
    Points : 257
    Points
    257
    Par défaut
    J'ai examiné les différentes classes de pyton-xml avec plus d'attention, et j'ai trouvé la fonction Document.writexml().

    J'ai modifié le source en conséquence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
    # On réinjecte dans le stream XML
    new_data = data
    xmlTrames[0].firstChild.data = new_data
     
    xmldoc.writexml(open("d:\\exemple.xml", "w"), "\t", "", "\n", "windows-1256")
    Et là... c'est le drame...

    Toujours l'erreur UnicodeEncoding... :

    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
    D:\>versxml.py
    Traceback (most recent call last):
      File "D:\versxml.py", line 15, in ?
        xmldoc.writexml(open("d:\\exemple.xml", "w"), "\t", "", "\n", "windows-1256")
      File "C:\Python24\lib\xml\dom\minidom.py", line 1746, in writexml
        node.writexml(writer, indent, addindent, newl)
      File "C:\Python24\lib\xml\dom\minidom.py", line 816, in writexml
        node.writexml(writer,indent+addindent,addindent,newl)
      File "C:\Python24\lib\xml\dom\minidom.py", line 816, in writexml
        node.writexml(writer,indent+addindent,addindent,newl)
      File "C:\Python24\lib\xml\dom\minidom.py", line 816, in writexml
        node.writexml(writer,indent+addindent,addindent,newl)
      File "C:\Python24\lib\xml\dom\minidom.py", line 1035, in writexml
        _write_data(writer, "%s%s%s"%(indent, self.data, newl))
      File "C:\Python24\lib\xml\dom\minidom.py", line 303, in _write_data
        writer.write(data)
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-2: ordinal not in range(128)
    Comment se débarrasser de cette vilaine erreur ?

    A toute fin utile, ma plateforme est Windows...

    Merci de votre aide

  3. #3
    Membre actif Avatar de Rupella
    Inscrit en
    Février 2005
    Messages
    286
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 286
    Points : 257
    Points
    257
    Par défaut
    Bon, j'ai trouvé...

    il faut que je fasse appel à
    sys.setdefaultencoding('windows-1256')
    Mais, souci... car dans la version que j'ai à disposition, cet appel m'est refusé (comme quoi la fonction n'est pas déclarée dans sys).
    Or, en regardant le fichier site.py situé dans le répertoire lib de la distrib, je trouve un bon :
    del sys.setdefaultencoding
    que j'ai supprimé, et voilà, le tour est joué.

    ==> Résolu !

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    j ai le meme probleme que toi... et j ai pas compris comment tu l a resolu...
    j ai besoin de l'aide merci d'avance

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

Discussions similaires

  1. [PHP 4] Lecture fichier XML avec PHP
    Par Oncle_Pete dans le forum Langage
    Réponses: 3
    Dernier message: 28/01/2009, 17h17
  2. Problème lecture de tables avec données type Oui/non
    Par Alixe80 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 20/04/2008, 17h44
  3. [DOM] lecture fichier XML avec DOM
    Par roosse dans le forum Format d'échange (XML, JSON...)
    Réponses: 8
    Dernier message: 09/04/2008, 12h39
  4. Réponses: 5
    Dernier message: 31/07/2007, 19h28
  5. [SAX] Java : problème de lecture d'XML avec SAX
    Par TheReturnOfMuton dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 22/06/2006, 18h26

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