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 :

Modifier un fichier XML avec Python


Sujet :

Python

  1. #1
    Membre habitué
    Homme Profil pro
    technicien
    Inscrit en
    Janvier 2022
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien

    Informations forums :
    Inscription : Janvier 2022
    Messages : 10
    Par défaut Modifier un fichier XML avec Python
    Bonjour à tous,

    je souhaiterais modifier un fichier xml et pouvoir le réutiliser.

    Je l'ouvre sous Python 2.7 en utilisant se code et je peux ainsi le modifier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    from xml.dom import minidom
    fsock = open('xxx.xml')
    xmldoc = minidom.parse(fsock) 
    fsock.close()                 
    print xmldoc.toxml()
    cependant quand je l'enregistre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    with open('xxx.xml','w') as f:
           f.write(xmldoc.toxml())

    J'ai bien mon fichier .xml mais le logiciel qui exploite ce ficher n'arrive plus à l'utiliser.

    Comment pourrais-je conserver ou retrouver l'encodage initial lors de l'enregistrement ?
    Quelqu'un aurait une idée ou ce n'est pas possible ?

    J'ai bien respecté la casse lors de la modification du fichier xml.

    D'avance merci,

    Bonne journée

    PS: je n'arrive pas à accéder au chat...

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 716
    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 716
    Par défaut
    Salut,

    Citation Envoyé par Kouider69 Voir le message
    J'ai bien mon fichier .xml mais le logiciel qui exploite ce ficher n'arrive plus à l'utiliser.
    Il faudrait déjà savoir ce quel/s est/sont le/s problème/s qui fait/font que le logiciel n'arrive plus à utiliser le fichier.

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

  3. #3
    Membre habitué
    Homme Profil pro
    technicien
    Inscrit en
    Janvier 2022
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien

    Informations forums :
    Inscription : Janvier 2022
    Messages : 10
    Par défaut
    D'abord merci de t'y être intéressé...

    il n'affiche pas les données ...

    Corrupted xml file (e.g. not matching the DTD)

    lorsque j'ouvre sur wordpad mon nouveau fichier xml on s'aperçoit qu'il n'est plus organisé de la même façon.
    même si il respecte la casse

    et si je fais l'essai sans faire aucune modification de mon fichier xml c'est le même défaut qui revient

    je passe par le cmd.exe pour enregistrer le fichier

    sauriez vous comment conserver ou retrouver l'encodage initiale?

    et obtenir les même DTD svp?

    d'avance merci

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 203
    Par défaut
    hello,
    Peux-tu nous montrer les premières lignes de ton fichier xml ? Il est complique le fichier xml ? Combien de lignes ?
    Ami calmant , J.P

  5. #5
    Membre habitué
    Homme Profil pro
    technicien
    Inscrit en
    Janvier 2022
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien

    Informations forums :
    Inscription : Janvier 2022
    Messages : 10
    Par défaut
    Merci...

    voici les premières lignes de code:

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <!DOCTYPE YBOECU SYSTEM ".\dtd\yboecu.dtd" [ <?RequiredDTDVersion "2.0"?>

    il y a 470 lignes environ.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 716
    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 716
    Par défaut
    Salut,

    Citation Envoyé par Kouider69 Voir le message
    sauriez vous comment conserver ou retrouver l'encodage initiale?
    Normalement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    with open('xxx.xml','w') as f:
           f.write(xmldoc.toxml(encoding='utf-8'))
    devrait suffire. Reste à voir s'il y a d'autres soucis.

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

  7. #7
    Membre habitué
    Homme Profil pro
    technicien
    Inscrit en
    Janvier 2022
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien

    Informations forums :
    Inscription : Janvier 2022
    Messages : 10
    Par défaut
    merci!

    mais oui, c'est le même souci

    c'est pas suffisant.

    J'ai essayé de le faire sans la moindre modification du fichier en l'ouvrant et en l'enregistrant sous python.

    Faudrait-il que j'utilise la version plus récente de Python?

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 716
    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 716
    Par défaut
    Citation Envoyé par Kouider69 Voir le message
    J'ai essayé de le faire sans la moindre modification du fichier en l'ouvrant et en l'enregistrant sous python.
    Quelles sont les différences dans ce cas?

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

  9. #9
    Membre habitué
    Homme Profil pro
    technicien
    Inscrit en
    Janvier 2022
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien

    Informations forums :
    Inscription : Janvier 2022
    Messages : 10
    Par défaut
    Pas de différence

    c'est le même message d'erreur.

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 716
    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 716
    Par défaut
    Je parlais de comparer le contenu des fichiers XML.

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

  11. #11
    Membre habitué
    Homme Profil pro
    technicien
    Inscrit en
    Janvier 2022
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien

    Informations forums :
    Inscription : Janvier 2022
    Messages : 10
    Par défaut
    ah,

    du coup ça n'a pas eu d'effet entre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f.write(xmldoc.toxml())
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f.write(xmldoc.toxml(encoding = ('UTF-8')))
    on reste bien en écart avec le fichier de base

    plus de tabulation et de structure une fois le fichier enregistré par python

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 203
    Par défaut
    hello,
    Citation Envoyé par Kouider69 Voir le message
    Merci...

    voici les premières lignes de code:

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <!DOCTYPE YBOECU SYSTEM ".\dtd\yboecu.dtd" [ <?RequiredDTDVersion "2.0"?>

    il y a 470 lignes environ.
    Ce que tu nous montres n'est pas complet où ne correspond pas au début d'un fichier xml valide (il y a un crochet ouvrant mais pas le crochet fermant. Peux-tu nous montrer l'intégralité du début du fichier (jusqu'à la première balise xml).
    Voici par exemple un fichier xml valide (plist est la première balise xml):
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <!DOCTYPE YBOECU SYSTEM ".\dtd\yboecu.dtd" []>
    <plist version="1.0"> <!-- this is root -->
    <Dispatch>
    	<field name="Poste" value="Dispatch01"/>
    	<field name="Vitesse" value="30"/>
    	<field name="PTL" value="0"/>
    	<field name="IP" value="192.168.87.10"/>
    </Dispatch>
    </plist>
    Ami calmant, J.P

  13. #13
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 716
    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 716
    Par défaut
    Salut,

    Citation Envoyé par Kouider69 Voir le message
    du coup ça n'a pas eu d'effet entre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f.write(xmldoc.toxml())
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f.write(xmldoc.toxml(encoding = ('UTF-8')))
    on reste bien en écart avec le fichier de base
    plus de tabulation et de structure une fois le fichier enregistré par python
    Chez moi, si je prends l'exemple de jurassic pork complété et que je l'écris dans un fichier test.xml:
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <!DOCTYPE YBOECU SYSTEM ".\dtd\yboecu.dtd" []>
    <plist version="1.0"> <!-- this is root -->
    <Dispatch>
    	<field name="Poste" value="élément"/>
    	<field name="Vitesse" value="30"/>
    	<field name="PTL" value="0"/>
    	<field name="IP" value="192.168.87.10"/>
    </Dispatch>
    </plist>
    Et que j'applique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> dom = parse('test.xml')
    >>> dom.toxml(encoding='utf-8')
    '<?xml version="1.0" encoding="utf-8"?><!DOCTYPE YBOECU  SYSTEM \'.\\dtd\\yboecu.dtd\' []><plist version="1.0"> <!-- this is root -->\n<Dispatch>\n\t<field name="Poste" value="\xc3\xa9l\xc3\xa9ment"/>\n\t<field name="Vitesse" value="30"/>\n\t<field name="PTL" value="0"/>\n\t<field name="IP" value="192.168.87.10"/>\n</Dispatch>\n</plist>'
    Je récupère la même structure (modulo quelques retour à la ligne) et on peut voir que l'encoding de "élément" est correct.

    De votre côté, demander de l'aide ok, mais si vous ne donnez pas d'informations pertinentes sur le problème rencontré autre que çà ne marche pas, comme on ne se déplace pas chez vous...

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

  14. #14
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 828
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 828
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Kouider69 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f.write(xmldoc.toxml(encoding = ('UTF-8')))
    on reste bien en écart avec le fichier de base
    Le premier test c'est lire le xml d'origine puis l'enregistrer dans un second sans modification. Et de faire une comparaison entre les deux (commande "cmp" ou "diff" sous Linux, "comp" sous Windows) pour voir où sont les différences.
    Accessoirement les parenthèses servent à prioriser des opérations (exemple (2+3)*4 pour que l'addition se fasse avant la multiplication). Mettre des parenthèses sur une simple valeur ne sert absolument à rien et montre juste que tu ne sais pas à quoi elles servent.

    Citation Envoyé par Kouider69 Voir le message
    sauriez vous comment conserver ou retrouver l'encodage initiale?
    notepad++ t'indique l'encodage initial du fichier qu'il ouvre. Sous Python il existe la librairie "chardet" qui peut te sniffer ton encodage. Exemple with open(fic, "rb") as fp: encoding=chardet.detect(fp.read()).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  15. #15
    Membre habitué
    Homme Profil pro
    technicien
    Inscrit en
    Janvier 2022
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien

    Informations forums :
    Inscription : Janvier 2022
    Messages : 10
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    hello,


    Ce que tu nous montres n'est pas complet où ne correspond pas au début d'un fichier xml valide (il y a un crochet ouvrant mais pas le crochet fermant. Peux-tu nous montrer l'intégralité du début du fichier (jusqu'à la première balise xml).
    Voici par exemple un fichier xml valide (plist est la première balise xml):
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <!DOCTYPE YBOECU SYSTEM ".\dtd\yboecu.dtd" []>
    <plist version="1.0"> <!-- this is root -->
    <Dispatch>
    	<field name="Poste" value="Dispatch01"/>
    	<field name="Vitesse" value="30"/>
    	<field name="PTL" value="0"/>
    	<field name="IP" value="192.168.87.10"/>
    </Dispatch>
    </plist>
    Ami calmant, J.P

    le voici:

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <!DOCTYPE YBOECU SYSTEM ".\dtd\yboecu.dtd" [ <?RequiredDTDVersion "2.0"?>
     
    <!NOTATION _OSrvLink SYSTEM "_OSrvLink" >
    ]><YBOECU
    	Name="ME400"
    	UCType="ME400UC"
    	VisibleName="ME400"><_System><_AdminInfo/><_LinkTarget/>

  16. #16
    Membre habitué
    Homme Profil pro
    technicien
    Inscrit en
    Janvier 2022
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien

    Informations forums :
    Inscription : Janvier 2022
    Messages : 10
    Par défaut
    Bonjour à tous,

    Tout d'abord merci pour votre aide.

    Je suis partisan du on va bien trouver une solution


    voici la différence due à la modification du code proposé

    Résultat xml
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    <?xml version="1.0" ?><!DOCTYPE YBOECU  SYSTEM '.\dtd\yboecu.dtd' [ <?RequiredDTDVersion "2.0"?>
    avec le code Python suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f.write(xmldoc.toxml())
    Résultat xml
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE YBOECU  SYSTEM '.\dtd\yboecu.dtd' [ <?RequiredDTDVersion "2.0"?>
    avec le code Python suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f.write(xmldoc.toxml(encoding = ('UTF-8')))
    il a ajouté ça : encoding="UTF-8"

    Remarque sur Notepad++

    Fichier modèle .xml est de 470 Lignes environ

    et les fichiers modifiés via le code python:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f.write(xmldoc.toxml())
    Ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f.write(xmldoc.toxml(encoding = ('UTF-8')))
    >>>ne font que 4 lignes



    *Pour les informations incomplètes:

    >>>je suis un débutant ce sont mes toutes premières lignes de codes merci de votre compréhension

    Bonne journée

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 203
    Par défaut
    Il me semble bien que ton fichier xml source est incorrect il ne devrait pas y a avoir <?RequiredDTDVersion "2.0"?> entre les crochets, que des balises qui commencent par <! Exemple :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <!DOCTYPE sgml [
      <!ELEMENT sgml (img)*>
      <!ELEMENT img EMPTY>
      <!ATTLIST img
         data ENTITY #IMPLIED>
      <!ENTITY   example1SVG     SYSTEM "example1.svg" NDATA example1SVG-rdf>
      <!NOTATION example1SVG-rdf SYSTEM "example1.svg.rdf">
    ]>

    dans ton fichier source c'est <!NOTATION _OSrvLink SYSTEM "_OSrvLink" >

    Ton fichier source devrait ressembler à quelque chose comme ceci :
    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
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <!DOCTYPE YBOECU SYSTEM ".\dtd\yboecu.dtd" [<!NOTATION _OSrvLink SYSTEM "_OSrvLink" >]>
    <YBOECU
        Name="ME400"
        UCType="ME400UC"
    VisibleName="ME400"><_System><_AdminInfo/><_LinkTarget/>
    <plist version="1.0"> <!-- this is root -->
    <Dispatch>
        <field name="Poste" value="Dispatch01"/>
        <field name="Vitesse" value="30"/>
        <field name="PTL" value="0"/>
        <field name="IP" value="192.168.87.10"/>
    </Dispatch>
    </plist>
    </_System>
    </YBOECU>

    Ami calmant, J.P

  18. #18
    Membre habitué
    Homme Profil pro
    technicien
    Inscrit en
    Janvier 2022
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien

    Informations forums :
    Inscription : Janvier 2022
    Messages : 10
    Par défaut
    Merci à tous les aidants

    ma demande n'était pas possible car il y avait plusieurs fichiers xml à modifier

    du coup la modification du fichier seul lié aux autres fichiers xml non modifiés ne pouvait pas fonctionner.


    Bonne journée

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

Discussions similaires

  1. Lecture dun fichier xml avec python
    Par merlinerick dans le forum Interfaçage autre langage
    Réponses: 6
    Dernier message: 29/07/2009, 13h49
  2. 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
  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. [DOM] [Débutant(e)] Modifier un fichier XML avec DOM
    Par macks dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 05/07/2005, 14h13

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