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 :

Python XML Parsing


Sujet :

Python

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 168
    Par défaut Python XML Parsing
    Je recois d'un MOM un ensemble de message text au format xml que je met dans un tableau de type list
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tbStrXml= [u"<?xml version='1.0' encoding='UTF-8'?><message type='create' date='20110921121011'><customer login='dssdsdzsdsdsd'><name>sdsdsdsdsdssd</name><new_password>sdsdsdssd</new_password><password>fghfgfhfhfhfh</password><user_email/><signature>2305</signature><active>true</active><adresse><active/><city></city><mobile/><name/><phone></phone><street></street><street2>43</street2><zip>92152</zip></adresse><company><city> fghffghfhfgh</city><name>fhgfghfghfghf</name><phone/><street>ghfghfghjfghjfhj</street><street2/><zip>9712</zip><ref/></company><lang><context_lang/></lang><group><Comment>gfhfhfh</Comment></group></customer></message>"]
    Lorsque j'effectue ce code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    import xml.etree.cElementTree as ElementTree
     
       for strContenu in tbStrXml:
    	strChaine = strContenu
    	strChaine = strChaine.strip()
    	print "Valeur strChaine :",strChaine,ElementTree.XML(strChaine)
    J'ai le message suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <Element message at 3>
    Quelqu'un a t il une piste ?

  2. #2
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Et ? Ou est le problème ? xml.etree.ElementTree.XML retourne bien une instance comme demandé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> for strContenu in tbStrXml:
    ...     e = ElementTree.XML(strContenu)
    ...     print e.keys()
    ... 
    ['date', 'type']
    >>> print dir(e)
    ['__copy__', '__deepcopy__', '__reduce__', 'append', 'clear', 'find', 'findall', 'findtext', 'get', 'getchildren', 'getiterator', 'insert', 'items', 'keys', 'makeelement', 'remove', 'set']
    >>> print e
    <Element 'message' at 0xb78a0bd8>
    @+

  3. #3
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Une question quand même: Pourquoi ne pas stocker directement l'xml dans la liste ?

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 707
    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 707
    Par défaut
    Salut,
    Pour aller dans le sens de PauseKawa, vous récupérez des "documents XML" sous forme sérialisée (une suite de caractères).

    Pour traiter leur contenu, plutôt que de passer par des regexp appliquées sur la forme "sérialisée", vous utilisez Element Tree pour les transformer en "objet".

    Cet "objet" est "composé": c'est un arbre (il a une racine) contenant des objets de type Element. Comme c'est un arbre on peut le "traverser" en parcourant l'ensemble de ses "noeuds".

    Un Element XML c'est un "tag", des "attributes", du "text", des "children" et un "tail" +/- optionnels.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TEXT = """<?xml version='1.0' encoding='UTF-8'?><root><a><b>a1</b></a><a><b>a2</b></a></root>"""
    import xml.etree.cElementTree as et
     
    root = et.XML(TEXT)
    for e in root.iter():
        print 'tag:"%s", text="%s"' % (e.tag, e.text)
    Produit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    tag:"root", text="None"
    tag:"a", text="None"
    tag:"b", text="a1"
    tag:"a", text="None"
    tag:"b", text="a2"
    Vous avez aussi des fonction de filtrage avancé dites Xpath qui permettent de filtrer les noeuds que vous voulez "sortir":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for e in root.findall("a/b"):
        print 'tag:"%s", text="%s"' % (e.tag, e.text)
    ne sortira que les elements:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tag:"b", text="a1"
    tag:"b", text="a2"
    J'ai profité de l'occasion pour revoir un peu ElementTree: un de ses avantages est d'être inclus dans Python. Mais son gros inconvénient dans le cas particulier et de ne pas inclure la partie "validation" du document contre un XSD ou un DTD: j'ai pas trouvé et c'est pour cela que je préfère lxml.

    En effet, je ne vois pas trop l'intérêt de structurer les échanges dans un format aussi bavard si on n'en profite pas pour s'assurer que le message est bien construit, que les données sont dans le format attendu,...
    Autant échanger des tuple (format .CSV) ou du JSON: c'est moins compliqué à mettre en oeuvre et moins couteux en temps de traitement.

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

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 168
    Par défaut
    Merci pourtoutes vos réponses.
    Citation Envoyé par wiztricks Voir le message
    Salut,
    Pour aller dans le sens de PauseKawa, vous récupérez des "documents XML" sous forme sérialisée (une suite de caractères).

    Pour traiter leur contenu, plutôt que de passer par des regexp appliquées sur la forme "sérialisée", vous utilisez Element Tree pour les transformer en "objet".

    Cet "objet" est "composé": c'est un arbre (il a une racine) contenant des objets de type Element. Comme c'est un arbre on peut le "traverser" en parcourant l'ensemble de ses "noeuds".

    Un Element XML c'est un "tag", des "attributes", du "text", des "children" et un "tail" +/- optionnels.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TEXT = """<?xml version='1.0' encoding='UTF-8'?><root><a><b>a1</b></a><a><b>a2</b></a></root>"""
    import xml.etree.cElementTree as et
     
    root = et.XML(TEXT)
    for e in root.iter():
        print 'tag:"%s", text="%s"' % (e.tag, e.text)
    Produit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    tag:"root", text="None"
    tag:"a", text="None"
    tag:"b", text="a1"
    tag:"a", text="None"
    tag:"b", text="a2"
    Vous avez aussi des fonction de filtrage avancé dites Xpath qui permettent de filtrer les noeuds que vous voulez "sortir":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for e in root.findall("a/b"):
        print 'tag:"%s", text="%s"' % (e.tag, e.text)
    ne sortira que les elements:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tag:"b", text="a1"
    tag:"b", text="a2"
    J'ai profité de l'occasion pour revoir un peu ElementTree: un de ses avantages est d'être inclus dans Python. Mais son gros inconvénient dans le cas particulier et de ne pas inclure la partie "validation" du document contre un XSD ou un DTD: j'ai pas trouvé et c'est pour cela que je préfère lxml.

    En effet, je ne vois pas trop l'intérêt de structurer les échanges dans un format aussi bavard si on n'en profite pas pour s'assurer que le message est bien construit, que les données sont dans le format attendu,...
    Autant échanger des tuple (format .CSV) ou du JSON: c'est moins compliqué à mettre en oeuvre et moins couteux en temps de traitement.

    - W

Discussions similaires

  1. [XHTML] Erreur de validation XML Parsing
    Par helpcomm dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 02/05/2008, 16h57
  2. [Linux-XML] Probléme avec python-xml
    Par Exodus dans le forum Général Python
    Réponses: 5
    Dernier message: 27/03/2007, 15h47
  3. [Tableaux] XML parsing en PHP
    Par dimitryous dans le forum Langage
    Réponses: 1
    Dernier message: 22/03/2007, 19h52
  4. XML Parsing Error: not well-formed
    Par localhost dans le forum Valider
    Réponses: 5
    Dernier message: 16/06/2005, 14h20
  5. Réponses: 14
    Dernier message: 25/10/2004, 21h33

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