Désactiver Adblock

AdBlock bloque du contenu sur le site

ADBlock errore

Question

Je suis sur le point de créer un élément d'un projet qui devra créer et publier un document XML sur un service Web. J'aimerais le faire en Python, afin de développer mes compétences.

Malheureusement, bien que je connaisse assez bien le modèle XML dans .NET, je ne sais pas quels sont les avantages et les inconvénients des modèles XML en Python.

Quelqu'un a-t-il déjà fait du traitement XML en Python? Où suggérez-vous que je commence? Les fichiers XML que je vais créer seront assez simples.

Solution

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

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

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

Autres conseils

ElementTree possède une belle API pythony. Je pense qu'il est même livré avec Python 2.5

C'est du pur python 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. Vous pouvez théoriquement simplement l'échanger lorsque vous découvrez que vous en avez besoin.

Il existe trois manières principales de traiter avec XML, en général: dom, sax et xpath. Le modèle dom est utile si vous pouvez vous permettre de charger tout votre fichier xml en mémoire en une fois, et que vous ne vous occupez pas des structures de données et que vous examinez une grande partie 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 que vous pouvez les traiter de manière séquentielle. Le modèle xpath est un peu de chacun - vous pouvez choisir les chemins d'accès aux éléments de données dont vous avez besoin, mais cela nécessite davantage de bibliothèques.

Si vous souhaitez une solution simple et intégrée à Python, minidom est votre réponse, mais elle est plutôt boiteuse et la documentation est & "voici la documentation sous DOM, allez le découvrir &" ;. C'est vraiment agaçant.

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

J'ai utilisé des systèmes de sax, et à bien des égards, ils sont plus & "; pythonic &"; à leur sens, mais je finis généralement par créer des systèmes étatiques pour les gérer, et c’est de cette façon que se trouve la folie (et les bugs).

Je dis: allez avec 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 le recommande.

C’est pythonique, vient «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 très facile à utiliser.

Lxml présente certains avantages en termes de performances, mais ils sont inégaux et vous devez tout d'abord vérifier les repères pour votre cas d'utilisation.

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

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

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

Si vous travaillez uniquement sur des documents simples, le faire vous-même peut s'avérer plus rapide et plus simple que l'apprentissage d'un cadre. Si vous pouvez éventuellement écrire le code XML à la main, vous pouvez probablement également le coder à la main (n'oubliez pas d'échapper correctement aux caractères spéciaux et utilisez str.encode(codec, errors="xmlcharrefreplace")). En dehors de ces snafus, XML est suffisamment régulier pour que vous ne ayez pas besoin d’une bibliothèque spéciale pour l’écrire. Si le document est trop compliqué à écrire à la main, vous devriez probablement vous pencher sur l’un des cadres déjà mentionnés. À aucun moment, vous ne devriez avoir besoin d'écrire un écrivain XML général.

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

Puisque vous avez dit que vous allez construire & "assez simple &"; XML, le module minidom (faisant partie du Python Standard Library) conviendra probablement à vos besoins. Si vous avez déjà utilisé la représentation DOM de XML, vous devriez trouver l’API assez simple.

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

Il m'est apparu que la création de documents XML (SOAP) était relativement simple si vous disposiez d'une structure de données " correspond à " le schéma.

Je garde l'enveloppe, car l'enveloppe de réponse est (presque) identique à l'enveloppe de demande. Ensuite, ma structure de données étant un dictionnaire (éventuellement imbriqué), je crée une chaîne qui transforme ce dictionnaire en & Lt; clé & Gt; valeur & Lt; / clé & Gt; articles.

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

Vous pouvez également créer (relativement) facilement des listes, même si, en fonction de votre client, vous pouvez rencontrer des problèmes à moins d'indication de longueur.

Pour moi, c'était beaucoup plus simple, car un dictionnaire est une méthode de travail beaucoup plus simple qu'une classe personnalisée. Pour les livres, générer du XML est beaucoup plus facile que d’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é (validation de schéma, analyse de sax, XPath, diverses sortes d’itérateurs et de nombreuses autres fonctionnalités).

Vous devez l'installer, mais dans de nombreux endroits, il est déjà supposé faire partie d'un équipement standard (par exemple, Google AppEngine n'autorise pas les packages Python en C, mais crée une exception pour lxml, pyyaml ​​et quelques autres). .

Construction 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 un certain temps pour trouver celle qui semble facile à utiliser et à lire.

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

E-factory fournit une syntaxe simple et compacte pour la génération de XML et 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 tout 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 contenu de l'attribut de formatage (voir func CLASS dans exemple complet lxml )

Permet des constructions très lisibles avec des listes

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)

ayant pour résultat:

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

Conclusions

Je recommande vivement de lire le tutoriel lxml - il est très bien écrit et vous donnera beaucoup plus de raisons d'utiliser cette puissante bibliothèque.

Le seul inconvénient de lxml est qu’il doit être compilé. Consultez la réponse SO pour obtenir de plus amples conseils sur la procédure d’installation de lxml à partir du package au format wheel en une fraction de seconde.

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

Je recommande vivement la SAX - Simple API for XML - mise en œuvre dans les bibliothèques Python. Ils sont assez faciles à installer et à traiter XML volumineux en utilisant même API, comme indiqué dans les précédentes affiches ici, et ont une faible empreinte mémoire contrairement à la validation de DOM style <=> parseur.

Je suppose que le traitement .Net du traitement XML repose sur une version de MSXML et, dans ce cas, je suppose que l'utilisation de minidom, par exemple, vous ferait vous sentir un peu chez vous. Toutefois, s’il s’agit d’un traitement simple, toutes les bibliothèques le feront probablement.

Je préfère également travailler avec ElementTree lorsque vous utilisez XML en Python, c’est une bibliothèque très soignée.

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