Rectification d'erreur de balise xml dans python

Résolu/Fermé
rasielblas Messages postés 140 Date d'inscription jeudi 20 mars 2014 Statut Membre Dernière intervention 12 mai 2021 - Modifié le 20 nov. 2019 à 12:54
rasielblas Messages postés 140 Date d'inscription jeudi 20 mars 2014 Statut Membre Dernière intervention 12 mai 2021 - 22 nov. 2019 à 13:52
Bonjour,

j'ai une balise xml qui contient une erreur est qu'on m'a demandé de rectifié avec python mais je ne sais pas comment procédé après avoir documenté dans plusieurs forum ce qui m'a permis de postulé ce sujet.
En fait j'ai un fichier xml:

<?xml version='1.0' encoding='iso-8859-1'?>
<Information>
    <personnel>
         <contact>03210000000</contact>
   </personnel>
<Information>
  


Ce fichier xml contient parfois une caractère spéciaux avant la balise
exemple :

&<information>
    %<personnel>
           @<contact>03210000000</contact>
       </personnel>
</information>


Et j'aimerais rectifié automatiquement avec python pour détecter automatiquement ce caractère spéciaux et le modifié pour que la caractère spéciaux devant la balise sera supprimé automatiquement:
Donc pour la résultat:

&<information> devient <information>

Tous ce que j'ai réussi pour l'instant c'est d'afficher tous les balises avec ce code:

import xml.etree.ElementTree as ET
import os
from xml.dom import minidom

doc = minidom.parse("Monfichier.xml")
        print(doc.toxml())



Mais je ne sais pas comment faire pour la suite, pouvez vous m'aider s'il vous plait?
Cordialement,

Configuration: Windows / Firefox 70.0
A voir également:

1 réponse

Bonjour.

Il faudrait plutôt faire ça avec re.

>>> import re
>>> s = '''&<information>
...     %<personnel>
...            @<contact>03210000000</contact>
...        </personnel>
... </information>'''
>>> re.sub('\S(?=<)', '', s)
'<information>\n    <personnel>\n           <contact>0321000000</contact>\n       </personnel>\n</information>'



A faire donc sur le contenu du fichier ouvert avec open.
1
rasielblas Messages postés 140 Date d'inscription jeudi 20 mars 2014 Statut Membre Dernière intervention 12 mai 2021 9
21 nov. 2019 à 12:16
Merci ca marche bien, mais j'ai une autre question sur ce sujet, comment fait-on pour modifier le fichier si elle se trouve dans un fichier nommé monfichier.xml

J'ai éssayé de faire comme ceci:


# ecrire dans un fichier
def ecrireDansFichier(path, texte):
    fichier = open("mondossier" + "//" + path, "w")
    fichier.writelines(texte)
    fichier.close()


# lire un fichier
def lireFichier(path):
    fichier = open("mondossier" + "//" + path, "r")
    ligne = fichier.readline()
    ligne = ligne.strip()
    print
    ligne
    # return ligne
    fichier.close()


ecrireDansFichier("monfichier.xml",re.sub('\S(?=<)','',lireFichier("monfichier.xml")))



et cela me génère une erreur de type:

Traceback (most recent call last):
File "D:/Montravail/xml 18-11-2019/index.py", line 189, in <module>
ecrireDansFichier("Deces.xml",re.sub('\S(?=<)','',lireFichier("monfichier.xml")))
File "C:\Python37-32\lib\re.py", line 192, in sub
return _compile(pattern, flags).sub(repl, string, count)
TypeError: expected string or bytes-like object
0
trifou > rasielblas Messages postés 140 Date d'inscription jeudi 20 mars 2014 Statut Membre Dernière intervention 12 mai 2021
21 nov. 2019 à 17:17
Normal, ta fonction lireFichier ne retourne rien.
readline ne lit qu'une seule ligne du fichier.
ligne.strip n'a aucune utilité ici.
writelines attend une liste ou tuple, pas un simple texte.

Dans ton cas, tu n'as besoin que de read et write.

import os
import re

FILE_PATH = 'mondossier'

def ecrireDansFichier(path, texte):
    with open(os.path.join(FILE_PATH, path), "w") as f:
        f.write(texte)

def lireFichier(path):
    with open(os.path.join(FILE_PATH, path), "r") as f:
        return f.read()

ecrireDansFichier("monfichier_2.xml", re.sub('\S(?=<)', '', lireFichier("monfichier.xml")))
0
rasielblas Messages postés 140 Date d'inscription jeudi 20 mars 2014 Statut Membre Dernière intervention 12 mai 2021 9
22 nov. 2019 à 13:52
Vous êtes vraiment très fort! merci ça marche très bien! merci beaucoup!
0