Traitement XML en Python

Translate

Je suis sur le point de construire 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, 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 une expérience du traitement XML en Python? Par où suggéreriez-vous que je commence? Les fichiers XML que je vais créer seront assez simples.

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

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

Surtout pour les petits trucs 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 unforboucle 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 appelezexpandNode(). Cela répond à mon exigence générale d'efficacité «responsable» sans sacrifier la facilité d'utilisation et la simplicité.

La source
Translate

ElementTreea une belle API pythony. Je pense qu'il est même livré dans le cadre de python 2.5

C'est en python pur et comme je le dis, plutôt sympa, mais si vous finissez par avoir besoin de plus de performances, alorslxmlexpose 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.

La source
Translate

Il existe 3 façons principales de traiter 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 à la fois, et que cela ne vous dérange pas de traiter les structures de données, et que vous regardez 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 que vous traitez de gros fichiers et que vous pouvez les traiter séquentiellement. Le modèle xpath est un peu de chacun - vous pouvez choisir des chemins vers les éléments de données dont vous avez besoin, mais il nécessite plus de bibliothèques à utiliser.

Si vous voulez être simple et empaqueté avec Python, minidom est votre réponse, mais c'est assez boiteux, et la documentation est "voici la documentation sur dom, allez-y". 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 saxophones, et à bien des égards, ils sont plus «pythoniques» dans leur sens, 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 aller avec minidom si vous aimez la recherche, ou ElementTree si vous voulez un bon code qui fonctionne bien.

La source
Myron Lee
Translate

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

C'est pythonique, 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 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 benchmarks pour votre cas d'utilisation.

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

La source
Translate

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

J'ai beaucoup utilisé minidom pour écrire du XML, mais cela consistait généralement à lire des documents, à faire quelques transformations simples et à les réécrire. Cela fonctionnait assez bien jusqu'à ce que j'aie besoin de la capacité de commander 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 ne travaillez que sur des documents simples, le faire vous-même peut être plus rapide et plus simple que d'apprendre un cadre. Si vous pouvez éventuellement écrire le XML à la main, vous pouvez probablement le coder à la main également (n'oubliez pas d'échapper correctement les caractères spéciaux et d'utiliserstr.encode(codec, errors="xmlcharrefreplace")). En dehors de ces snafus, XML est assez régulier pour que vous neavoir besoinune 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. A aucun moment vous ne devriez avoir besoin d'écrire un écrivain XML général.

La source
Translate

Vous pouvez également essayerdémêlerpour analyser des documents XML simples.

La source
Translate

Puisque vous avez mentionné que vous allez créer du XML "assez simple", lemodule minidom(qui fait partie de la bibliothèque standard Python) répondra probablement à vos besoins. Si vous avez une expérience avec la représentation DOM de XML, vous devriez trouver l'API assez simple.

La source
Translate

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 une source fermée, 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 avez une structure de données qui «s'adapte» au schéma.

Je garde l'enveloppe car l'enveloppe de réponse est (presque) la même que l'enveloppe de requête. Ensuite, comme 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écursivité 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 (relativement) facilement créer des listes, bien que, selon votre client, vous puissiez rencontrer des problèmes à moins que vous ne donniez des indices de longueur.

Pour moi, c'était beaucoup plus simple, car un dictionnaire est une manière beaucoup plus simple de travailler qu'une classe personnalisée. Pour les livres, générer du XML est beaucoup plus facile que l'analyse!

La source
Translate

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à supposé faire partie de l'équipement standard (par exemple, Google AppEngine n'autorise pas les packages Python basés sur C, mais fait une exception pour lxml, pyyaml et quelques autres).

Construire des 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 aussi facile à lire.

Exemple de code dedoc lxml sur l'utilisation de 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 le suivi des choses

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 trucs comme:

  • utilisation des espaces de noms
  • nœuds de texte de début et de fin dans un élément
  • fonctions de mise en forme du contenu des attributs (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 vivement de lire le didacticiel lxml - il est très bien écrit et vous donnera de nombreuses autres raisons d'utiliser cette puissante bibliothèque.

Le seul inconvénient de lxml est qu'il doit être compilé. VoirSO réponse pour plus de conseilscomment installer lxml à partir du package de format de roue en une fraction de seconde.

La source
Translate

Si vous comptez créer des messages SOAP, consultezsoaplib. 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.

La source
Translate

Je recommande fortementSAX - Simple API for XML- implémentation dans les bibliothèques Python. Ils sont assez faciles à configurer et à traiterXMLpar même conduitAPI, comme discuté par les affiches précédentes ici, et ont une faible empreinte mémoire contrairement à la validationDOMstyleXMLanalyseurs.

La source
Translate

Je suppose que la manière .Net de traiter XML repose sur une version de MSXML et dans ce cas, je suppose que l'utilisation par exemple de minidom vous ferait vous sentir un peu chez vous. Cependant, s'il s'agit d'un traitement simple que vous faites, 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.

La source