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 :

Questions autour de la génération d'un XML


Sujet :

Python

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2015
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2015
    Messages : 89
    Points : 56
    Points
    56
    Par défaut Questions autour de la génération d'un XML
    Bonjour,

    je génère un fichier XML à partir d'un fichier texte. Je rencontre quelques problèmes.
    La 1ère ligne est constitué de la sorte :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    <?xml version="1.0"?>
    or, il faudrait que j'obtienne :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>

    Comment ajouter les attributs manquants ? J'utilise la librairie ElementTree pour écrire mon fichier. La sortie se fait de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        xmlstr = minidom.parseString(ET.tostring(diffusion, encoding="utf-8", method="xml")).toprettyxml(indent="   ")
        with open(output_xml + nom_du_fichier + ".xml", mode_ouverture) as f:
            f.write(xmlstr)
    Autre point, la validation du fichier xml produit n'est pas valide avec le XSD (valide en utilisant xmlschema mais non valide en utilisant checker_xml). De plus, lorsque je passe le fichier dans XMLSpy, il m'indique qu'il manque certains préfixes namespaces pour certaines balises (ex : <References> => attendu <tns:References>). Comment faire pour ajouter cette information ?

    Dernier point, est-ce qu'il existe sous Python, l'équivalent d'un JaxB Java permettant de générer des classes à partir du fichier XSD et ainsi construire le XML en utilisant les classes générées ?

    Merci pour vos retours et pistes.

    Cdt,

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par lasnico37 Voir le message
    Comment ajouter les attributs manquants ? J'utilise la librairie ElementTree pour écrire mon fichier. La sortie se fait de cette manière
    En cherchant un peu sur Internet vous trouveriez cet article. qui donne plein d'options.


    Citation Envoyé par lasnico37 Voir le message
    il m'indique qu'il manque certains préfixes namespaces pour certaines balises (ex : <References> => attendu <tns:References>). Comment faire pour ajouter cette information ?
    Je ne sais pas. J'ai toujours considéré le support des namespaces dans la bibliothèque standard un peu faible et utilisé lxml dans ce cas. Néanmoins, la bibliothèque standard a bien évolué mais je n'ai pas revu ce qu'on peut faire ou pas avec.

    Citation Envoyé par lasnico37 Voir le message
    Dernier point, est-ce qu'il existe sous Python, l'équivalent d'un JaxB Java permettant de générer des classes à partir du fichier XSD et ainsi construire le XML en utilisant les classes générées ?
    Là aussi, Internet retourne des articles donnant des solutions à explorer.

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

  3. #3
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Autre point, la validation du fichier xml produit n'est pas valide avec le XSD (valide en utilisant xmlschema mais non valide en utilisant checker_xml).
    Ne faut-il pas montrer les documents xml résultant et xsd pour faire une opinion ? Je ne sais pas ce que c'est checker_xml; mais, l'un vaiidé et l'autre invalidé, en principe, c'est grave.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par tsuji Voir le message
    l'un vaiidé et l'autre invalidé, en principe, c'est grave.
    Peut être que çà veut juste dire que XSD/XML est tellement laxiste qu'il faut indiquer le "checker" utilisé pour valider un document d'après le XSD.

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

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2015
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2015
    Messages : 89
    Points : 56
    Points
    56
    Par défaut
    Bonjour,

    désolé de répondre que maintenant.

    checker_xml, toutes mes excuses, c'est une classe utilisant lxml pour effectuer la validation. Voici mes deux portions de codes qui vérifie le xml produit :
    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
     
    from xmlschema import XMLSchemaValidationError
    from checker.checker_xml import checker_xml
    import xmlschema
    import constantes
    import errors
    import log
    import os
     
    # Utilisation de lxml
    validator_xml = checker_xml(constantes.REP_XSD)
    XML_DIR = constantes.REP_OUTPUT_FILE
    for file_name in os.listdir(XML_DIR):
        file_path = '{}/{}'.format(XML_DIR, file_name)
        if validator_xml.validate(file_path):
            log.logger.info("Le fichier XML {0} est valide ".format(file_path))
        else:
            log.logger.error(errors.ERROR_CHECK_XML_FILE.format(file_path))
     
    # Utilisation de xmlschema
    XML_DIR = constantes.REP_OUTPUT_FILE
    my_schema = xmlschema.XMLSchema(constantes.REP_XSD)
    for file_name in os.listdir(XML_DIR):
        file_path = '{}/{}'.format(XML_DIR, file_name)
        try:
            my_schema.is_valid(file_path)
            log.logger.info("Le fichier XML {0} est valide ".format(file_path))
        except XMLSchemaValidationError:
            log.logger.error(errors.ERROR_CHECK_XML_FILE.format(file_path))
    Le code de la classe checker_xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    from lxml import etree
    class checker_xml:
     
        def __init__(self, xsd_path: str):
            xmlschema_doc = etree.parse(xsd_path)
            self.xmlschema = etree.XMLSchema(xmlschema_doc)
     
        def validate(self, xml_path: str) -> bool:
            xml_doc = etree.parse(xml_path)
            result = self.xmlschema.validate(xml_doc)
     
            return result
    Ces deux portions de code sont testés dans un script en mode scratch.
    Le résultat en sortie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Erreur XSD : le fichier C:/APPLIDATA/fic/test/output//xxxx.xml n'est pas valide.
    Le fichier XML C:/APPLIDATA/fic/test/output//xxxx.xml est valide
    Pour mon problème d'avoir les attributs dans la 1ère ligne, je l'ai résolu de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        xmlstr = minidom.parseString(ET.tostring(diffusion, encoding="utf-8", method="xml")).toprettyxml(indent="   ")
        xmlOk = xmlstr.replace('<?xml version="1.0" ?>', '<?xml version="1.0" encoding="utf-8" standalone="yes"?>')
        with open(output_xml + nom_fichier + ".xml", mode_ouverture) as f:
            f.write(xmlOk)
    En testant d'autres options pour ajouter l'encoding directement dans "toprettyxml", je me retrouvais avec un xml contenant un b' en début de ligne, le tout sur une seule ligne avec des \n \t entre chaque balises.

    Je suis preneur de tout retours. Je continue à chercher de mon côté et je vais regarder pour générer des classes Python à partir d'un xsd via generateDS.

    Merci.

  6. #6
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Merci pour la précision. Pour avoir un point de repère indépendant de l'engin de validation, montrez un instance de xml produit et le xsd de référence qui produissent ce problème. De par ceux-là, je peux peut-être donner une opinion.

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2015
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2015
    Messages : 89
    Points : 56
    Points
    56
    Par défaut
    Bonjour à tous,

    j'ai réussi à m'en sortir en ajoutant dans le code la directive suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ns = {"tns": "http://www.cnamts.fr/centredenotif/xsd/common/v1"}
    puis pour les balises qui ont besoin d'un namespace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    nom = ET.SubElement(client, ET.QName(ns["tns"], "nom"))
    Cela fonctionne très bien, et le XML produit est valide ;-)

    Je vais pouvoir creuser sur la génération de classes Python à partir d'un XSD (comme JaxB en java). J'ai commencé avec GenerateDS mais il a créé qu'un seul module Python (avec JaxB pour le même XSD tout est découpé).

    Merci pour vos retours.

    Bonne journée.

Discussions similaires

  1. Trois questions autour de Windows Server
    Par Kain94 dans le forum Windows Serveur
    Réponses: 5
    Dernier message: 07/08/2006, 10h32
  2. [JSF] Questions autour des servlets
    Par maximus001ma dans le forum JSF
    Réponses: 4
    Dernier message: 25/07/2006, 13h27
  3. pb de génération de fichier xml
    Par peppena dans le forum Langage
    Réponses: 5
    Dernier message: 03/07/2006, 09h56
  4. [DOM] problème de génération d'un xml avec dom
    Par WalidNat dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 04/05/2006, 17h12
  5. [DOM] Génération dynamique fichier xml
    Par Fabouney dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 03/10/2005, 09h45

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