Question

Je suis sur le point de créer une partie d'un projet qui devra construire et publier un document XML sur un service Web et j'aimerais le faire en Python, afin d'élargir mes compétences.

Malheureusement, même si je connais assez bien le modèle XML dans .NET, je ne suis pas sûr des avantages et des inconvénients des modèles XML dans Python.

Quelqu'un a-t-il de l'expérience dans le traitement XML en Python ?Par où me suggéreriez-vous de commencer ?Les fichiers XML que je vais créer seront assez simples.

Était-ce utile?

La solution

Personnellement, j'ai joué avec plusieurs des options intégrées sur un projet lourd en XML et j'ai opté pour pulldom comme le meilleur choix pour les documents moins complexes.

Surtout pour les petites choses simples, j'aime la théorie de l'analyse basée sur les événements plutôt que de mettre en place toute une série de rappels pour une structure relativement simple. Voici une bonne discussion rapide sur la façon d'utiliser l'API.

Ce que j'aime:vous pouvez gérer l'analyse dans un for boucle plutôt que d’utiliser des rappels.Vous retardez également l'analyse complète (la partie "pull") et n'obtenez des détails supplémentaires que lorsque vous appelez expandNode().Cela répond à mon exigence générale d’efficacité « responsable » sans sacrifier la facilité d’utilisation et la simplicité.

Autres conseils

ArbreÉlément a une belle API pythony.Je pense qu'il est même livré avec Python 2.5

C'est en python pur et comme je l'ai dit, plutôt sympa, mais si vous avez besoin de plus de performances, alors lxml expose la même API et utilise libxml2 sous le capot.En théorie, vous pouvez simplement l'échanger lorsque vous découvrez que vous en avez besoin.

Il existe trois manières principales de gérer XML, en général :dom, sax et xpath.Le modèle dom est bon si vous pouvez vous permettre de charger l'intégralité de votre fichier XML en mémoire en même temps, et que cela ne vous dérange pas de gérer les structures de données, et que vous examinez une grande partie/la plupart du modèle.Le modèle Sax est idéal si vous ne vous souciez que de quelques balises et/ou si vous traitez de gros fichiers et pouvez les traiter de manière séquentielle.Le modèle XPath est un peu de chaque : vous pouvez choisir les chemins d'accès aux éléments de données dont vous avez besoin, mais il nécessite l'utilisation de plus de bibliothèques.

Si vous voulez du simple et du package avec Python, minidom est votre réponse, mais c'est assez boiteux, et la documentation est "voici la documentation sur dom, allez comprendre".C'est vraiment agaçant.

Personnellement, j'aime cElementTree, qui est une implémentation plus rapide (basée sur C) d'ElementTree, qui est un modèle de type dom.

J'ai utilisé des systèmes de saxophone, et à bien des égards, ils sont plus "pythoniques", mais je finis généralement par créer des systèmes basés sur des états pour les gérer, et c'est de cette façon que réside la folie (et les bugs).

Je dis d'opter pour Minidom si vous aimez la recherche, ou ElementTree si vous voulez un bon code qui fonctionne bien.

J'ai utilisé ElementTree pour plusieurs projets et je le recommande.

Il est pythonique, est livré « dans la boîte » avec Python 2.5, y compris la version c cElementTree (xml.etree.cElementTree) qui est 20 fois plus rapide que la version pure de Python et est très facile à utiliser.

lxml présente certains avantages en termes de performances, mais ils sont inégaux et vous devez d'abord vérifier les références pour votre cas d'utilisation.

Si je comprends bien, le code ElementTree peut facilement être porté sur lxml.

Cela dépend un peu de la complexité du document.

J'ai beaucoup utilisé minidom pour écrire du XML, mais il s'agit généralement simplement de lire des documents, d'effectuer quelques transformations simples et de les réécrire.Cela a assez bien fonctionné jusqu'à ce que j'aie besoin de pouvoir ordonner les attributs des éléments (pour satisfaire une ancienne application qui n'analyse pas correctement XML).À ce stade, j'ai abandonné et j'ai écrit le XML moi-même.

Si vous travaillez uniquement sur des documents simples, le faire vous-même peut être plus rapide et plus simple que d'apprendre un framework.Si vous pouvez éventuellement écrire le XML à la main, vous pouvez probablement le coder également à la main (n'oubliez pas d'échapper correctement les caractères spéciaux et d'utiliser str.encode(codec, errors="xmlcharrefreplace")).En dehors de ces problèmes, XML est suffisamment régulier pour que vous ne le fassiez pas. besoin une bibliothèque spéciale pour l'écrire.Si le document est trop compliqué à rédiger à la main, vous devriez probablement vous tourner vers l’un des frameworks déjà mentionnés.À aucun moment vous ne devriez avoir besoin d’écrire un rédacteur XML général.

Vous pouvez également essayer démêler pour analyser des documents XML simples.

Puisque vous avez mentionné que vous allez construire du XML "assez simple", le module mini-dom (qui fait partie de la bibliothèque standard Python) répondra probablement à vos besoins.Si vous avez de l'expérience avec la représentation DOM de XML, vous devriez trouver l'API assez simple.

J'écris un serveur SOAP qui reçoit des requêtes XML et crée des réponses XML.(Malheureusement, ce n'est pas mon projet, donc c'est un code source fermé, mais c'est un autre problème).

Il s'est avéré pour moi que la création de documents XML (SOAP) est assez simple si vous disposez d'une structure de données qui « correspond » au schéma.

Je garde l'enveloppe puisque l'enveloppe réponse est (presque) la même que l'enveloppe demande.Ensuite, puisque ma structure de données est un dictionnaire (éventuellement imbriqué), je crée une chaîne qui transforme ce dictionnaire en éléments <key>value</key>.

C'est une tâche que la récursion simplifie et je me retrouve avec la bonne structure.Tout cela est réalisé en code python et est actuellement suffisamment rapide pour une utilisation en production.

Vous pouvez également (relativement) facilement créer des listes, bien que, en fonction de votre client, vous puissiez rencontrer des problèmes à moins que vous ne donniez des indications sur la longueur.

Pour moi, c'était beaucoup plus simple, puisqu'un dictionnaire est un moyen beaucoup plus simple de travailler qu'une classe personnalisée.Pour les livres, générer du XML est bien plus simple que l’analyser !

Pour un travail sérieux avec XML en Python, utilisez lxml

Python est livré avec la bibliothèque intégrée ElementTree, mais lxml l'étend en termes de vitesse et de fonctionnalités (validation de schéma, analyse sax, XPath, divers types d'itérateurs et de nombreuses autres fonctionnalités).

Vous devez l'installer, mais dans de nombreux endroits, il est déjà considéré comme faisant partie de l'équipement standard (par ex.Google AppEngine n'autorise pas les packages Python basés sur C, mais fait une exception pour lxml, pyyaml ​​et quelques autres).

Création de documents XML avec E-factory (à partir de lxml)

Votre question concerne la création d'un document XML.

Avec lxml, il existe de nombreuses méthodes et il m'a fallu du temps pour trouver celle qui semble facile à utiliser et également facile à lire.

Exemple de code de doc lxml sur l'utilisation d'E-factory (légèrement simplifié):


L'E-factory fournit une syntaxe simple et compacte pour générer du XML et du HTML :

>>> from lxml.builder import E

>>> html = page = (
...   E.html(       # create an Element called "html"
...     E.head(
...       E.title("This is a sample document")
...     ),
...     E.body(
...       E.h1("Hello!"),
...       E.p("This is a paragraph with ", E.b("bold"), " text in it!"),
...       E.p("This is another paragraph, with a", "\n      ",
...         E.a("link", href="http://www.python.org"), "."),
...       E.p("Here are some reserved characters: <spam&egg>."),
...     )
...   )
... )

>>> print(etree.tostring(page, pretty_print=True))
<html>
  <head>
    <title>This is a sample document</title>
  </head>
  <body>
    <h1>Hello!</h1>
    <p>This is a paragraph with <b>bold</b> text in it!</p>
    <p>This is another paragraph, with a
      <a href="http://www.python.org">link</a>.</p>
    <p>Here are some reserved characters: &lt;spam&amp;egg&gt;.</p>
  </body>
</html>

J'apprécie sur E-factory les choses suivantes

Le code se lit presque comme le document XML résultant

La lisibilité compte.

Permet la création de n'importe quel contenu XML

Prend en charge des éléments tels que :

  • utilisation des espaces de noms
  • début et fin des nœuds de texte dans un élément
  • fonctions formatant le contenu de l'attribut (voir func CLASS dans échantillon lxml complet)

Permet des constructions très lisibles avec des listes

par exemple.:

from lxml import etree
from lxml.builder import E
lst = ["alfa", "beta", "gama"]
xml = E.root(*[E.record(itm) for itm in lst])
etree.tostring(xml, pretty_print=True)

résultant en:

<root>
  <record>alfa</record>
  <record>beta</record>
  <record>gama</record>
</root>

Conclusions

Je recommande fortement de lire le didacticiel lxml - il est très bien écrit et vous donnera bien d'autres raisons d'utiliser cette puissante bibliothèque.

Le seul inconvénient de lxml est qu’il doit être compilé.Voir Alors répondez pour plus de conseils comment installer lxml à partir du package au format wheel en une fraction de seconde.

Si vous envisagez de créer des messages SOAP, consultez savonlib.Il utilise ElementTree sous le capot, mais il fournit une interface beaucoup plus propre pour sérialiser et désérialiser les messages.

Je recommande fortement SAX - Simple API for XML - implémentation dans les librairies Python.Ils sont assez faciles à configurer et à traiter de grandes XML même en conduisant API, comme indiqué dans les affiches précédentes ici, et ont une faible empreinte mémoire contrairement à la validation DOM style XML analyseurs.

Je suppose que la manière .Net de traiter XML s'appuie sur une version de MSXML et dans ce cas, je suppose que l'utilisation par exemple de minidom vous ferait sentir un peu chez vous.Cependant, s'il s'agit d'un traitement simple, n'importe quelle bibliothèque fera probablement l'affaire.

Je préfère également travailler avec ElementTree lorsque je traite du XML en Python, c'est une bibliothèque très soignée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top