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 :

Petit effet problème de formalisme XML


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut Petit effet problème de formalisme XML
    bonjour

    voici mon 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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    # coding: utf-8
     
     
    import random
    from dataclasses import dataclass
    from bs4 import BeautifulSoup
    from datetime import datetime, timedelta ,date
    import time
    #from lxml import *
     
    from lxml import etree
     
     
    @dataclass 
    class Ametropie:   
        oeil :str = None
        sphere : float = 0.0
        cylindre :float = 0.0
        axeDuCylindre :int = 0
        addition : float = 0.0
        photochromie :int =0
     
        def xml(self):
            resultat = f"<ametropie>\r"
            resultat += f"<oeil>{self.oeil}</oeil>\r"
            resultat += f"<sphere>{self.sphere}</sphere>\r"
            resultat += f"<cylindre>{self.cylindre}</cylindre>\r"
            resultat += f"<axeDuCylindre>{self.axeDuCylindre}</axeDuCylindre>\r"
            resultat += f"<addition>{self.addition}</addition>\r"
            resultat += f"<photochromie>{self.photochromie}</photochromie>\r"
            resultat += f"</ametropie>"
     
            print(resultat)
            print("-----------------------------------")
     
     
            soup = BeautifulSoup(resultat ,'xml')  # Mise en forme
            resultatsoup= soup.prettify()
            return resultatsoup
     
        def xml_2(self):
     
            ametropie = etree.Element("ametropie")
     
            oeil = etree.SubElement(ametropie, "oeil")
            oeil.text = f'{self.oeil}'
            sphere = etree.SubElement(ametropie, "sphere")
            sphere.text =f'{self.sphere}'
     
            cylindre = etree.SubElement(ametropie, "cylindre")
            cylindre.text = f'{self.cylindre}' 
     
            axeDuCylindre = etree.SubElement(ametropie, "axeDuCylindre")
            axeDuCylindre.text = f'{self.axeDuCylindre}' 
     
            addition = etree.SubElement(ametropie, "addition")
            addition.text = f'{self.addition}'
     
     
            photochromie = etree.SubElement(ametropie, "photochromie")
            photochromie.text = f'{self.photochromie}' 
     
     
            return etree.tostring(ametropie, pretty_print=True)
     
     
     
        def aleaoire(self):
            self.axeDuCylindre = random.randint(0, 150)
            self.sphere =  random.randrange(-100,100,4)/16
            self.cylindre =  random.randrange(-100,100,4)/16
            self.addition =  random.randrange(0,16,4)/16
            self.photochromie = random.randint(0, 1)
     
     
    if __name__ == '__main__':
     
     
        ametropie_OD =Ametropie()
        ametropie_OD.oeil ="3D"
        ametropie_OD.aleaoire()
        xml_am = ametropie_OD.xml()
        print(xml_am)
        print("------------------------")
        xml_am = ametropie_OD.xml_2()
        print(xml_am)

    ce qui me gène dans le résultat c'est l'affichgae que donne la class xml_2(self)
    la commande de formalisation de la classe tostring extraite de "from lxml import etree " -->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      etree.tostring(ametropie, pretty_print=True)
    me retourne ceci


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     b'<ametropie>\n  <oeil>3D</oeil>\n  <sphere>2.5</sphere>\n  <cylindre>-4.5</cylindre>\n  <axeDuCylindre>136</axeDuCylindre>\n  <addition>0.75</addition>\n  <photochromie>1</photochromie>\n</ametropie>\n'
    les métablises de formalisation des tabulations ne semblent pas pris en compte et de plus on voit apparaitre un caractère "b" devant la chaine.....

    si j'ajoute une commande format-string

    cela ne change sur l'interprétation de /t


    et si je reprendre les données du print afficher dans la console
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        print(f"""b'<ametropie>\n  <oeil>3D</oeil>\n  <sphere>2.5</sphere>\n  <cylindre>-4.5</cylindre>\n  <axeDuCylindre>136</axeDuCylindre>\n  <addition>0.75</addition>\n  <photochromie>1</photochromie>\n</ametropie>\n'""")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    b'<ametropie>
      <oeil>3D</oeil>
      <sphere>2.5</sphere>
      <cylindre>-4.5</cylindre>
      <axeDuCylindre>136</axeDuCylindre>
      <addition>0.75</addition>
      <photochromie>1</photochromie>
    </ametropie>
    '
    le formalisme est plus propre mais ce caratère b est toujours


    qu'en a beautifulsoop 4 c'est un peut mieux mais bon.....

    Code XML : 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
    <?xml version="1.0" encoding="utf-8"?>
    <ametropie>
     <oeil>
      3D
     </oeil>
     <sphere>
      -1.0
     </sphere>
     <cylindre>
      -2.0
     </cylindre>
     <axeDuCylindre>
      33
     </axeDuCylindre>
     <addition>
      0.5
     </addition>
     <photochromie>
      1
     </photochromie>
    </ametropie>


    alors si vous avez une idee elle sera bienvenue , merci

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Citation Envoyé par dedalios Voir le message
    les métablises de formalisation des tabulations ne semblent pas pris en compte et de plus on voit apparaitre un caractère "b" devant la chaine.....
    Le 'b' signale qu'il s'agit de bytes. Ce qui est normal pour une structure de données XML (sérialisée).

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

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut !

    Est-ce que ceci répond à ton problème ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> toto = b'<ametropie>\n  <oeil>3D</oeil>\n  <sphere>2.5</sphere>\n  <cylindre>-4.5</cylindre>\n  <axeDuCylindre>136</axeDuCylindre>\n  <addition>0.75</addition>\n  <photochromie>1</photochromie>\n</ametropie>\n'
     
    >>> print(toto.decode('ascii'))
    <ametropie>
      <oeil>3D</oeil>
      <sphere>2.5</sphere>
      <cylindre>-4.5</cylindre>
      <axeDuCylindre>136</axeDuCylindre>
      <addition>0.75</addition>
      <photochromie>1</photochromie>
    </ametropie>
    PS : encode et decode prennent également un argument errors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> 'Français, ℱ'.encode(encoding='ascii', errors='xmlcharrefreplace')
    b'Français, ℱ'  #Le résultat visuel est différent sur une console, ici le site transforme le résultat... Essaye de ton côté !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> utf8_data = 'Français, ℱ'.encode(encoding='utf8')
     
    >>> utf8_data.decode('ascii', errors='surrogateescape')
    'Fran\udcc3\udca7ais, \udce2\udc84\udcb1'
    Dernière modification par Invité ; 21/08/2022 à 16h07.

  4. #4
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut
    il semble que l'appel a "decode" ne plait pas à python

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if __name__ == '__main__':
     
     
        xml_am = ametropie_OD.xml_2()
        reponse =xml_am.decode('ascii')
        print(f'{reponse}')
    réponse de python3

    reponse =xml_am.decode('ascii')
    AttributeError: 'str' object has no attribute 'decode'. Did you mean: 'encode'?

    qu'as encode ....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    if __name__ == '__main__':
     
     
        ametropie_OD =Ametropie()
        ametropie_OD.oeil ="3D"
        ametropie_OD.aleaoire()
        #xml_am = ametropie_OD.xml()
        #print(xml_am)
        #print("------------------------")
     
            xml_am = ametropie_OD.xml_2()
        reponse =xml_am.encode(encoding='ascii', errors='xmlcharrefreplace')
        print(f'{reponse}')
    il ajoute encore le metacaractairebinary ......
    b"b'<ametropie>\\n <oeil>3D</oeil>\\n <sphere>-0.75</sphere>\\n <cylindre>-5.5</cylindre>\\n <axeDuCylindre>84</axeDuCylindre>\\n <addition>0.75</addition>\\n <photochromie>0</photochromie>\\n</ametropie>\\n'"

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Citation Envoyé par dedalios Voir le message
    il semble que l'appel a "decode" ne plait pas à python
    Le message d'erreur dit que "decode" (i.e. convertir bytes en str-ing) ne s'applique pas à des str-ing (déjà décodé) - mais on peut leur appliquer encode pour les transformer en bytes -.

    La conversion bytes en string (et réciproquement) sont des bases, si vous appliquez bêtement ce qu'on vous raconte sans trop chercher à comprendre pourquoi, à quoi, comment,... ça ne marchera pas.

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

  6. #6
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 219
    Par défaut
    hello,
    tu peux aussi utiliser le module prettierfier qui permet de formatter du xml :
    This module parses HTML/XML as a raw string to more intelligently format tags.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import prettierfier
    # ......
     
    #return etree.tostring(ametropie, pretty_print=True)
     return prettierfier.prettify_xml(etree.tostring(ametropie))
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <ametropie>
      <oeil>3D</oeil>
      <sphere>2.25</sphere>
      <cylindre>-4.25</cylindre>
      <axeDuCylindre>114</axeDuCylindre>
      <addition>0.5</addition>
      <photochromie>1</photochromie>
    </ametropie>



    Ami calmant, J.P

Discussions similaires

  1. [XSLT] Problème de transformation XML avec un fichier xslt
    Par seb35 dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 24/04/2006, 22h02
  2. [XSLT][sablotron]Problème de parser XML
    Par sheura dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 14/11/2005, 17h39
  3. [SAX] Problème lecture fichier xml
    Par BernardT dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 07/07/2005, 18h11
  4. [Tomcat] Problème avec web.xml
    Par hichamus dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 01/03/2005, 16h57
  5. [débutant] [lomboz] Problème deploy.web.xml
    Par cdrikou dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 29/04/2004, 10h47

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