2 votes

Python en ligne de chaîne ou de modèle XML ou ASCII ?

Je génère des fichiers XML complexes à travers des scripts Python qui nécessitent toute une série d'instructions conditionnelles (exemple http://repository.azgs.az.gov/uri_gin/azgs/dlio/536/iso19139.xml). Je travaille avec plusieurs normes de métadonnées XML ou ASCII qui ont souvent un schéma pauvre ou sont assez vagues.

En PHP, j'ai simplement écrit le XML et inséré des morceaux de code PHP au besoin. Existe-t-il un moyen facile de le faire en Python? J'essaie d'éviter d'avoir à échapper tout ce XML. La méthode en ligne est également très utile pour ajuster le modèle sans avoir à tout réécrire.

J'ai jeté un coup d'œil aux solutions de templating en Python mais elles semblaient soit trop statiques soit exagérées. Transférer tout le XML dans un objet XML est beaucoup de travail au détriment de la flexibilité lors de la modification du modèle XML ou ASCII.

Merci pour le soutien aux débutants!

3voto

Joubert Nel Points 1559

Wgrunberg,

Je utilise la classe string.Template intégrée de Python comme ceci :

from string import Template
the_template = Template("Prénom : $first")
print the_template.substitute(section_id="anID", first="Sarah")

La sortie de ce code est la suivante:

Prénom : Sarah

Dans l'exemple ci-dessus, j'ai montré un modèle XML, mais tout "modèle" que vous pouvez décrire en tant que chaîne de caractères fonctionnerait.

Pour les conditionnels, vous pouvez faire quelque chose comme ceci :

print the_template.substitute(section_id="theID", first="Sarah" if 0==0 else "John")

Si vos conditionnels sont complexes, au lieu de les exprimer en ligne comme ci-dessus, envisagez de les regrouper dans des fermetures/fonctions.

1voto

Essayez n'importe quel moteur de template Python moderne non basé sur XML, par exemple Mako ou Jinja2. Ils sont assez faciles à intégrer dans votre projet, et vous pourrez alors écrire des choses telles que :

%if a > b:

%endif

Vous pouvez également utiliser du code python en ligne, y compris des affectations.

1voto

Alex Martelli Points 330805

La suggestion de @Gintautas d'utiliser un bon moteur de modèles serait également mon premier choix (surtout Mako, dont le "langage de modélisation" est essentiellement du Python avec un peu de balisage;-).

Cependant, de nombreuses personnes préfèrent, comme alternatives pour construire des fichiers XML, les écrire à partir du DOM, par exemple en utilisant (pour rester quelque chose de la bibliothèque standard) ElementTree ou (un package tiers, mais aucun problème à installer et très populaire) BeautifulSoup (n'hésitez pas à rester sur sa version 3.0.x sauf si vous utilisez Python 3!), spécifiquement la classe BeautifulStoneSoup (la classe BeautifulSoup est pour traiter HTML, la pierre pour le XML).

0voto

wgrunberg Points 55

Aller pour un modèle est la chose sensée à faire. Utiliser le modèle de chaîne intégré plutôt que des bibliothèques externes serait ma méthode préférée parce que j'ai besoin de pouvoir transmettre facilement les scripts ETL Python à d'autres personnes. Cependant, je pourrais m'en sortir en utilisant des modèles en mettant la chaîne XML entre guillemets simples et en utilisant des chaînes sur plusieurs lignes. Voici un exemple de cette méthode brute.

    for row in metadata_dictionary:
        iso_xml = ''
        iso_xml += ' *** un tas de XML *** '
        iso_xml += '\
 \n\
     \n'
        if row['MetadataContactName']:
            iso_xml += '\
       \n\
        '+row['MetadataContactName'].lower().strip()+' \n\
       \n'
        if row['MetadataContactOrganisation']:
            iso_xml += '\
       \n\
        '+row['MetadataContactOrganisation'].lower().strip()+' \n\
       \n'
        iso_xml += ' *** plus de XML *** '

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X