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 et XML avec minodom


Sujet :

Python

  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 Python et XML avec minodom
    bonjour

    je cherche a utiliser minidom sur la base de cette note
    www.fil.univ-lille1.fr/~marvie/python/chapitre4.html

    En ligne de commande sous window10 (pas de linux ou d'unix possible dans l’environnement )

    Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> from xml.dom import minidom
    >>> doc = minidom('cas11.xml')
    voici la réponse de python
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: 'module' object is not callable

    donc je suppose qu'il manque une phase d'installation du module minidom ?

    le but final lire un fichier xml
    identifier des balises et les modifier pour construire des simulations

    Peut-être ce module n'est pas le plus adapté. et ne me parler pas de linux , car impossible pour moi de disposer d'un tel environnement chez l'utilisateur finale.

  2. #2
    Membre chevronné
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2012
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2012
    Messages : 321
    Par défaut
    Bonjour,
    Je ne connais pas ce module mais regardez à nouveau le lien que vous donnez vous même.
    Le premier exemple de code de ce lien indique une utilisation sous la forme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> from xml.dom import minidom
    >>> doc = minidom.parse('/tmp/contacts.xml')
    >>> doc
    <xml.dom.minidom.Document instance at 0x...>
    Dans votre code, vous n'appelez que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    >>> from xml.dom import minidom
    >>> doc = minidom('cas11.xml')

  3. #3
    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 fichier xml HS
    Citation Envoyé par killian68 Voir le message
    Bonjour,
    Je ne connais pas ce module mais regardez à nouveau le lien que vous donnez vous même.
    Le premier exemple de code de ce lien indique une utilisation sous la forme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> from xml.dom import minidom
    >>> doc = minidom.parse('/tmp/contacts.xml')
    >>> doc
    <xml.dom.minidom.Document instance at 0x...>
    Dans votre code, vous n'appelez que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    >>> from xml.dom import minidom
    >>> doc = minidom('cas11.xml')

    c'est en fait le fichier xml qui est HS

    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "D:\Python36\lib\xml\dom\minidom.py", line 1958, in parse
    return expatbuilder.parse(file)
    File "D:\Python36\lib\xml\dom\expatbuilder.py", line 910, in parse
    with open(file, 'rb') as fp:
    FileNotFoundError: [Errno 2] No such file or directory: '/tmp/contacts.xml'

  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 xml et python
    from xml.dom import minidom
    ou
    from lxml import etree

    voir d'autre solution?
    quelle serait le meilleurs outil de parser XML permettant d'identifier une ou plusieurs balises donnée possiblement présente de 0 à n fois dans un fllux XML. De modifier cette balise et de reconstruire le fichiers XML?

  5. #5
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Citation Envoyé par dedalios
    c'est en fait le fichier xml qui est HS
    "en fait"? comment ça? Vous voulez dire ce que killian68 poste ne soit pas sur le point de la question posée? Si oui, dites-le avant passer à autre chose.

  6. #6
    Membre expérimenté
    Profil pro
    Loisir
    Inscrit en
    Novembre 2011
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Loisir

    Informations forums :
    Inscription : Novembre 2011
    Messages : 159
    Par défaut
    Bonjour,

    essayez ceci dans votre cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    from xml.dom import minidom
    doc = minidom.parse('cas11.xml')
    au lieu de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    from xml.dom import minidom
    doc = minidom('cas11.xml')
    La réponse de killian68 répond à votre problème il me semble.

    Juste une question : cela fait-il longtemps que vous utilisez python ? Vous ne semblez pas comprendre les messages d'erreur qui vous ont été retournés :

    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "D:\Python36\lib\xml\dom\minidom.py", line 1958, in parse
    return expatbuilder.parse(file)
    File "D:\Python36\lib\xml\dom\expatbuilder.py", line 910, in parse
    with open(file, 'rb') as fp:
    FileNotFoundError: [Errno 2] No such file or directory: '/tmp/contacts.xml'
    Vous indique que le fichier contacts.xml dans le dossier /tmp n'existe pas. Cela semble normal puisque qu'il s'agit d'un document spécialement présenté dans l'exemple et qu'il vous faut remplacer par le vôtre.

    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: 'module' object is not callable
    Pour les callables je vous renvoie à http://sametmax.com/quest-ce-quun-callable-en-python/
    Je vais prendre l'exemple de numpy :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> import numpy
     
    >>> numpy([1,2,3])
    Traceback (most recent call last):
      File "<console>", line 1, in <module>
    TypeError: 'module' object is not callable
     
    >>> numpy.array([1,2,3])
    array([1, 2, 3])
    Numpy est la bibliothèque mais n'est en aucun cas un callable (fonction, classe, ...)

    Un exemple plus proche de votre cas est pyplot de matplotlib :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> from matplotlib import pyplot
     
    >>> pyplot([1,2],[10,5])
    Traceback (most recent call last):
      File "<console>", line 1, in <module>
    TypeError: 'module' object is not callable
     
    >>> pyplot.plot([1,2],[10,5])
    [<matplotlib.lines.Line2D object at 0x07091270>]
    Je vous laisse réfléchir sur ces informations.

    Bonne journée

  7. #7
    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 Pyhton et moi ?
    Je découvre python depuis 15 jours.

    Je ne vois pas la différence surement très subtile entre les 2 codes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from xml.dom import minidom
    doc = minidom.parse('cas11.xml')
    Détail : je lance la commande en ligne depuis le répertoire contenant le fichier xml.

    Autre point selon ma compréhension minidom serait un plugin python pour permettre de parser (lire et extraire les information) le XML. Donc il me semble étrange de devoir mettre mon document dans un répertoire \tmp
    amusant au passage le coding de type unix pour des process lancer sur windows.
    je vais regarde tes exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "D:\Python36\lib\xml\dom\minidom.py", line 1958, in parse
    return expatbuilder.parse(file)
    File "D:\Python36\lib\xml\dom\expatbuilder.py", line 910, in parse
    with open(file, 'rb') as fp:
    FileNotFoundError: [Errno 2] No such file or directory: '/tmp/contacts.xml'
    Vous indique que le fichier contacts.xml dans le dossier /tmp n'existe pas. Cela semble normal puisque qu'il s'agit d'un document spécialement présenté dans l'exemple et qu'il vous faut remplacer par le vôtre.
    IL n'existe pas dans le répertoire de l'installation de l'interpréteur python "D:\Python36\" et plus précisément dans le plugin "D:\Python36\lib\xml\dom\" de répertoire tmp
    Pour information ce répertoire est l’équivalent de base "C:\Program Files (x86)\Python36-32\" pour mais une installation spécifique . La variable du système "path" pointe donc sur le répertoire "D:\Python36\" qui contient pyhton.exe
    Je doute donc que dans le cas de développement d'un code python, il faille mettre les fichiers a traiter ou à lire dans le code du plugin que l'on appel par la commande import.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FileNotFoundError: [Errno 2] No such file or directory: '/tmp/contacts.xml'
    Amusant subtilité du retour de bug, le coding plus adapté au monde unix qu'a windows.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: 'module' object is not callable
    Tu me dites de regarde les exemples intéressant concernant les objets "callable" ? why not (et merci). Ceci étant dans notre cas , pourquoi un plugin système, au sens python du terme, pourrait généré une telle erreur ?

    Je suppose donc que le code xml du test comporte des erreurs . ( impossible de fournir ce code pour des problèmes droits ,donc je vais cherche dans mes sources d'exemple un cas plus pertinent pour ces tests.)

    merci pour vos infos.

  8. #8
    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 /tmp/contacts.xml
    Je viens de comprendre que l'histoire du /tmp/contacts.xml' n'a aucune rapport avec mes précédent propos.
    Dans l'exemple de code fournir par http://www.fil.univ-lille1.fr/~marvi...chapitre4.html

    il y a ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> from xml.dom import minidom
    >>> doc = minidom.parse('/tmp/contacts.xml')
    >>> doc
    <xml.dom.minidom.Document instance at 0x...>
    Si je regarde le code que voit- on : le codage unix des balises de répertoire , ce qui ne peux pas être compatible Windows.
    Ce qui veux simplement indiqué à Python que le fichier a lire ce trouve dans une sous répertoire "tmp" du répertoire de traitement.

    Donc si pour ma part en ligne de commande je tape
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from xml.dom import minidom
    doc = minidom.parse('cas11.xml')
    Ce qui veut simplement indiqué à Python que le fichier a lire ce trouve dans le répertoire de traitement.

    Il n'y a mon sens, aucune obligation de créer un répertoire 'tmp' . De plus si l'on envoi a python (sous Windows) , la position d'un fichier avec un format UNX, null doute qu'il est quelque problème.
    Toutes cette histoire est lié à divers erreur de saisie dans le nom de la fonction appeler . Fonction du plugin Python xml\dom et appelée.

  9. #9
    Membre expérimenté
    Profil pro
    Loisir
    Inscrit en
    Novembre 2011
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Loisir

    Informations forums :
    Inscription : Novembre 2011
    Messages : 159
    Par défaut
    J'ai corrigé l'erreur dans mon post due au copier-coller. Dans ton tout premier message, tu n'appelais pas la fonction parse de minidom. Minidom est un "sous-ensemble" de dom, lui-même un "sous-ensemble" de de la librairie xml.

    Je vois que tu as compris pour '\tmp\constacts.xml'.

    Je pense que tu obtiens maintenant ce dont tu as besoin pour accéder au contenu de ton document XML.

    Bonne journée.

  10. #10
    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 Pyhthon XML quid de l'outil pour une MISe àjour
    De façon plus synthétique :

    Voici rapidement brosser le cas qui m'occupe .
    1. Environnement Windows.

    1. Langue python 3.6





    Je veux a partir de fichiers XML et du langage Python automatiser des traitements permettant de modifier certain éléments divers balise XML.


    La structure de ce xml utilise des balises obligatoires et d'autre qui ne le sont pas.
    Les balises peuvent être absente , codé soit <mabalise></mabalise> soit simplement <mabalise/> .
    <mabalise> <MaBalisE> ou toutes déclinaisons des jeux de majuscule ou minuscule n'a pas d'importante dans l'interprétation finale du XML

    exemple de code de base

    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
    <Personne>
            <identifiant>1</identifiant>
    	<nom> 
                  <famille>DUPOND</famille>
                  <prenom>CAROLE</prenom>
             </nom>
             <age/>
             <rang>1<RANG/>
    </Personne>
    <Personne>
            <identifiant>2</identifiant>
    	<nom> 
                  <famille>DUPOND</famille>
                  <prenom>MARTIN</prenom>
             </nom>
             <age>20<age/>
               <RANG>1<RANG/>
    </Personne>


    version modifiée

    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
     
    <Personne>
            <identifiant>101</identifiant>
    	<Nom> 
                  <Famille>MARTIN</Famille>
                  <Prenom>JEAN</Frenom>
             </Nom>
             <Age>40<Age/>
            <Rang>1<Rang/>
    </Personne>
     
    <Personne>
            <identifiant>102</identifiant>
    	<Nom> 
                  <Famille>MARTIN</Famille>
                  <Prenom>MATILDE</Frenom>
             </Nom>
             <Age>39<Age/>
            <Rang>2<Rang/>
    </Personne>

    Donc ici j'ai modifié mon jeux d'essai en altérant le continue de certaine balise , en appliquant une forme de grammaire pour la simple lisibilité du code 'une majuscule pour la première lettre de la balise et le reste en minuscule'

    Pour le cas de la balise <Age> de créer l'information non existant dans le premier code

    Je cherche donc dans les divers outil XML fournir par Python le plus pertinent pour ce type de modification.

    Le module minidom est une mise en œuvre de DOM pour Python. Il fournit toutes les interfaces de base DOM et un parser de fichier (ou de chaîne) XML.
    Le module lxml.etree :l' API ElementTree

    ou d'autre solution

    j'aimerai savoir ce qui serait le pour pertinent
    Lecture de XML
    Identification de balise spécifique
    Mise à jour du contenu
    Constitution du fichier xml après modification
    Ecriture du nouveau fichier xml modifier.


    Je cherche l'outil le plus adapté

  11. #11
    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,

    Citation Envoyé par dedalios Voir le message
    Je cherche l'outil le plus adapté
    La réponse est écrite dans la documentation:
    xml.dom.minidom is a minimal implementation of the Document Object Model interface, with an API similar to that in other languages. It is intended to be simpler than the full DOM and also significantly smaller. Users who are not already proficient with the DOM should consider using the xml.etree.ElementTree module for their XML processing instead.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    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
    Citation Envoyé par wiztricks Voir le message
    Salut,



    La réponse est écrite dans la documentation:


    - W
    Quelle dommage ne pas avoir une traduction en français dans un site français.

  13. #13
    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 lxml import etree
    Donc il est proposé etree

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    # -*- coding: utf-8 -*-
    from lxml import etree
     
    try:
        # Appeler la fonction de traitement
        tree = etree.parse('cas11.xml')
        for user in tree.xpath("/users/user/nom"):
            print(user.text)
    j'ai donc trouvé cette exemple mais voila le plugin lxml n'existe pas dans etree "unresolve import"

    https://python.developpez.com/cours/...lementtree.php

  14. #14
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dedalios Voir le message
    Quelle dommage ne pas avoir une traduction en français dans un site français.
    Quel site français ?
    Si tu fais allusion au fait que ce n'est pas traduit sur developpez, bah tu n'as qu'à contribuer à la traduction, parce que bon, la critique est facile...

    Citation Envoyé par dedalios Voir le message
    j'ai donc trouvé cette exemple mais voila le plugin lxml n'existe pas dans etree "unresolve import"
    Mais qu'est-ce que tu racontes ?
    Il n'y a pas besoin de la bibliothèque lxml, uniquement de etree.

  15. #15
    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
    Mais qu'est-ce que tu racontes ?
    Il n'y a pas besoin de la bibliothèque lxml, uniquement de etree.
    Oui biensur mais les seuls lien remonté par les moteurs de recherche avec les termes Pyhton xml etree que j'ai obtenu (en français) ne m'ont donner que cette exemple....

    Traduire why not cela me pourrait me permettre d'améliorer mon anglais

  16. #16
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    En effet, difficile de trouver de la doc en français sur une bibliothèque précise, déjà que sur certaines la doc est obscure en anglais, pourtant même avec un faible niveau en anglais on arrive bien à se débrouiller, et de toute façon on ne peut y échapper.

    Mais des exemples avec etree, y'en a pas mal, déjà dans la doc python y'a des exemples assez parlants, et pas besoin d'être un parfait bilingue pour les comprendre.

    Maintenant, si tu as des difficultés à utiliser etree, tu devrais énumérer les points ou tu as des difficultés, etree est relativement facile à utiliser comparé au dom.

Discussions similaires

  1. pickler un fichier XML avec python
    Par Gldev_comp dans le forum Général Python
    Réponses: 1
    Dernier message: 10/07/2008, 05h31
  2. Traitement XML avec python
    Par diaboloche dans le forum Général Python
    Réponses: 5
    Dernier message: 02/03/2008, 00h32
  3. Lire un fichier XML avec Python
    Par eyquem dans le forum Général Python
    Réponses: 2
    Dernier message: 19/12/2007, 13h54
  4. Gérer un fichier XML avec Python
    Par ffets dans le forum Général Python
    Réponses: 25
    Dernier message: 31/10/2007, 14h47
  5. Python probleme pour traitement fichier Xml avec l'API dom
    Par chenimitz dans le forum Général Python
    Réponses: 11
    Dernier message: 30/10/2007, 19h34

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