Comment puis-je convertir ElementTree.Element
à une chaîne de caractères ?
Pour Python 3 :
xml_str = ElementTree.tostring(xml, encoding='unicode')
Pour Python 2 :
xml_str = ElementTree.tostring(xml, encoding='utf-8')
Ce qui suit est compatible avec Python 2 et 3, mais ne fonctionne que pour les caractères latins :
xml_str = ElementTree.tostring(xml).decode()
Exemple d'utilisation
from xml.etree import ElementTree
xml = ElementTree.Element("Person", Name="John")
xml_str = ElementTree.tostring(xml).decode()
print(xml_str)
Sortie :
<Person Name="John" />
Explication
Malgré ce que le nom indique, ElementTree.tostring()
renvoie un bytestring par défaut dans Python 2 & 3. C'est un problème dans Python 3, qui utilise Unicode pour les chaînes de caractères .
En Python 2, vous pouviez utiliser la fonction str
type pour les données textuelles et binaires . Malheureusement, cette confluence de deux concepts différents peut conduire à des code fragile qui fonctionnait parfois pour l'un ou l'autre type de données, parfois pas. [...]
Pour rendre la distinction entre les données textuelles et binaires plus claire et plus prononcée, [Python 3] a fait des données textuelles et binaires des types distincts qui ne peuvent pas être mélangés à l'aveuglette. .
Source : Portage du code Python 2 vers Python 3
Si nous savons quelle version de Python est utilisée, nous pouvons spécifier l'encodage en tant que unicode
o utf-8
. Sinon, si nous avons besoin d'une compatibilité avec Python 2 & 3, nous pouvons utiliser decode()
à convertir dans le type correct.
À titre de référence, j'ai inclus une comparaison des éléments suivants .tostring()
résultats entre Python 2 et Python 3.
ElementTree.tostring(xml)
# Python 3: b'<Person Name="John" />'
# Python 2: <Person Name="John" />
ElementTree.tostring(xml, encoding='unicode')
# Python 3: <Person Name="John" />
# Python 2: LookupError: unknown encoding: unicode
ElementTree.tostring(xml, encoding='utf-8')
# Python 3: b'<Person Name="John" />'
# Python 2: <Person Name="John" />
ElementTree.tostring(xml).decode()
# Python 3: <Person Name="John" />
# Python 2: <Person Name="John" />
Merci à Martijn Peters pour avoir souligné que le str
a changé entre Python 2 et 3.
Pourquoi ne pas utiliser str() ?
Dans la plupart des scénarios, l'utilisation de str()
serait le " canonique " pour convertir un objet en chaîne de caractères. Malheureusement, l'utilisation de cette méthode avec Element
renvoie l'emplacement de l'objet en mémoire sous la forme d'une chaîne hexadécimale, plutôt qu'une représentation en chaîne des données de l'objet.
from xml.etree import ElementTree
xml = ElementTree.Element("Person", Name="John")
print(str(xml)) # <Element 'Person' at 0x00497A80>