Enlever un caractère spéciaux dans un fichier xml en python [Résolu]

Signaler
Messages postés
104
Date d'inscription
jeudi 20 mars 2014
Statut
Membre
Dernière intervention
2 décembre 2019
-
rasielblas
Messages postés
104
Date d'inscription
jeudi 20 mars 2014
Statut
Membre
Dernière intervention
2 décembre 2019
-
Bonjour,
J'ai un fichier xml qui contient un caractère spéciaux que j'aimerais supprimer, j'ai trouvé comment détécter le caractère spéciaux mais je ne sais pas comment le supprimer et vous demande votre aide s'il vous plaît.
Voici mon code python:

list_noeud_parent = ['Parent']
            for noeudParent in list_noeud_parent:
                if self.root.find(noeudParent) is not None:
                    for child in self.root.findall(noeudParent):
                        tagSubElement = ["enfant1","enfant2"]
                        for tag in tagSubElement:
                            if child.find(tag) is not None:
                                if '@' in child.find(tag).text:
                                    print("Caractere speciaux trouvé: {}".format(child.find(tag).text))



Voici mon fichier xml:

<?xml version='1.0' encoding='iso-8859-1'?>
<Data>
  <Parent>
    <enfant1>Jacques@</enfant2>
   <enfant2>Paul@</enfant2>
    <enfant3>Paul@ Edouard</enfant2>
</Parent>
</Data>


J'aimerais donc comme résultat

Jacques@ devient Jacques
Paul@ devient Paul
Paul@ Edouard devient Paul Edouard

Cordialement,

5 réponses

Bonjour,

Supprimer un caractère d'une fin de chaine se fait avec str.rstrip

>>> 'Jacques@'.rstrip('@')
'Jacques'


Il reste plus qu'à changer le texte du node xml et d'enregistrer ton fichier modifications faites.
rasielblas
Messages postés
104
Date d'inscription
jeudi 20 mars 2014
Statut
Membre
Dernière intervention
2 décembre 2019

Merci ca marche très bien sauf que j'ai du mal à adapté le rstrip avec mon code pouvez vous m'aider?
j'ai fait quelque modification mais le résultat est un peu bizhare, en fait seul l'enfant 2 qui contient le virgule seul change mais le 1er enfant et la troisième enfant reste intacte .


for noeudParent in list_noeud_parent:
                if self.root.find(noeudParent) is not None:
                    for child in self.root.findall(noeudParent):
                        tagSubElement = ["enfant1","enfant2"]
                        for tag in tagSubElement:
                            if child.find(tag) is not None:
                                if '@' in child.find(tag).text:
                                    print("Caractere speciaux trouvé: {}".format(child.find(tag).text))

tree=ET.parse("monfichier.xml")
                                    root=tree.getroot()
                                    elems=root.findall(".//enfant1")
                                    for elem in elems:
                                        elems.text=child.find(tag).text.rstrip(',')
                        tree.write('nouveau_fichier.xml', encoding="UTF-8",xml_declaration=True)


Pouvez vous m'aider à rectifié mon code? merci encore!
Bonjour,

En effet, j'avais mal lu, je n'avais pas vu que le @ pouvait être dans le milieu de la chaine, alors str.replace est plus que suffisant pour peu que tous les @ de la chaine doivent être supprimés (s'il y a dans le tas des adresses mails, il faudra utiliser re.sub avec le motif qui va bien).

import xml.etree.ElementTree as ET

xml = '''<?xml version='1.0' encoding='iso-8859-1'?>
<Data>
    <Parent>
        <enfant1>Jacques@</enfant1>
        <enfant2>Paul@</enfant2>
        <enfant3>Paul@ Edouard</enfant3>
    </Parent>
</Data>'''

data = ET.fromstring(xml)
for enfant in data.find('Parent'):
    text = enfant.text.replace('@', '')
    enfant.text = text
    
print(ET.tostring(data, encoding='unicode'))
rasielblas
Messages postés
104
Date d'inscription
jeudi 20 mars 2014
Statut
Membre
Dernière intervention
2 décembre 2019

Ça marche très bien! je vous remercie! votre aide est vraiment précieux!