Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 18/03/2021, à 11:14

DonutMan75

Python et écriture au format xml...

Bonjour à tous,
je cherche à obtenir avec python un fichier xml qui ait *exactement* cette tête là :

<?xml version="1.0"?>
<Root type="xml">

<!--Generation time UTC=2020-12-01T10:30:35-->

 <Logiciel version="2.0"></Logiciel>
</Root>

Vous noterez en particulier :

  1. l'indentation hiérarchique et les retours à la ligne

  2. la non-utilisation des formats cours pour les balises vides

Ainsi, je veux pas obtenir :

<Logiciel version="2.0"/>

Mais bel et bien :

<Logiciel version="2.0"></Logiciel>

Je me suis basé sur les modules suivants :

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

Mon soucis :
- ElementTree permet d'interdire l'utilisation des formats courts MAIS ne fait pas de "jolis" retours à la ligne avec indentation automatique
- Minidom fait du "fancy printing" MAIS utilise automatiquement les formats courts

Voici mes deux essais :

Essai 1 : utilisation uniquement de ElementTree

import datetime as dt
import xml.etree.ElementTree as ET

root = ET.Element("Root", attrib={"type":"xml"});
root.append(ET.Comment("Generation time %s" % dt.strftime(dt.now(), 'UTC=%Y-%m-%dT%H:%M:%S') ))

root.append(ET.Element("Logiciel", attrib={"version":"2.0"}))

xml_string = ET.tostring(root, encoding='utf-8', xml_declaration=True, short_empty_elements=False)
print(xml_string)
b'<?xml version=\'1.0\' encoding=\'utf-8\'?>\n<Root type="xml"><!--Generation time UTC=2021-03-18T10:54:48--><Logiciel version="2.0"></Logiciel></Root>'

Vous noterez que j'ai bien "<Logiciel version="2.0"></Logiciel>" (grâce à l'option "short_empty_elements" positionnée à False)


Essai2 : ajout de la fonction toprettyxml du module minidom

J'obtiens les retours à la ligne et l'indentation MAIS je perds le short_empty_elements

reparsed = minidom.parseString(xml_string)
xml_string_2 = reparsed.toprettyxml(indent=" ")
print(xml_string_2)
<?xml version="1.0" ?>
<Root type="xml">
 <!--Generation time UTC=2021-03-18T10:54:48-->
 <Logiciel version="2.0"/>
</Root>

Avez-vous une idée pour résoudre ce problème ?

Merci d'avance !!

Donut

Hors ligne

#2 Le 18/03/2021, à 15:05

Arbiel

Re : Python et écriture au format xml...

Bonjour

Je n'ai pas lu la totalité de ton message. Je peux cependant te faire part de ma petite expérience xml avec Python. J'ai initialement utilisé les mêmes modules que toi, avec difficulté. J'utilise maintenant BeautifulSoup qui me va beaucoup mieux.

Je ne peux pas te dire si ce module te permet d'avoir les indentations souhaitées ni les balises vides comme tu le souhaites, mais sa facilité d'utilisation me pousse à te conseiller de l'essayer.

Arbiel


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#3 Le 18/03/2021, à 17:43

DonutMan75

Re : Python et écriture au format xml...

Hello Arbiel,

merci pour ton retour !

Je vais creuser dans cette direction smile

A bientôt,

D.

Hors ligne