Traitement XML en Python

voix
61

Je suis sur le point de construire un morceau d'un projet qui devra construire et afficher un document XML à un service Web et je voudrais le faire en Python, comme un moyen d'élargir mes compétences en elle.

Malheureusement, alors que je connais le modèle XML assez bien dans .NET, je suis certain que les avantages et les inconvénients sont des modèles XML en Python.

Tout le monde a l'expérience de faire le traitement de XML en Python? Où proposeriez-vous commencer? Les fichiers XML que je vais bâtiment sera assez simple.

Créé 02/08/2008 à 04:35
source utilisateur
Dans d'autres langues...                            


16 réponses

voix
30

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

Il est en python pur et comme je le dis, assez agréable, mais si vous liquidez besoin plus de performance, puis lxml expose la même API et utilise libxml2 sous le capot. Vous pouvez théoriquement juste échanger quand vous découvrez que vous en avez besoin.

Créé 02/08/2008 à 16:21
source utilisateur

voix
22

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

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

Ce que j'aime: vous pouvez gérer l'analyse syntaxique dans une forboucle plutôt que d' utiliser les callbacks. Vous retardez également l' analyse complète (la partie « pull ») et seulement obtenir des détails supplémentaires lorsque vous appelez expandNode(). Cela satisfait mon exigence générale d'efficacité « responsable » sans sacrifier la facilité d'utilisation et la simplicité.

Créé 02/08/2008 à 05:01
source utilisateur

voix
6

Plongez au coeur de Python a un chapitre. Ne peut pas se porter garant de la façon dont il serait bon cependant.

Créé 02/08/2008 à 04:43
source utilisateur

voix
5

Cela dépend un peu sur la façon dont le document doit être compliqué.

Je l'ai utilisé minidom beaucoup pour l'écriture XML, mais qui est généralement juste été la lecture des documents, faire quelques transformations simples, et les écrire arrière. Cela a fonctionné assez bien jusqu'à ce que je avais besoin la possibilité de commander des attributs d'éléments (pour satisfaire une demande ancienne qui n'analyse pas correctement XML). À ce moment-là j'ai donné et écrit moi-même le XML.

Si vous ne travailler sur des documents simples, puis en faisant vous - même peut être que l' apprentissage d' un cadre plus rapide et plus simple. Si vous pouvez imaginer écrire le XML à la main, vous pouvez coder probablement la main aussi bien (rappelez - vous juste pour échapper correctement les caractères spéciaux et utiliser str.encode(codec, errors="xmlcharrefreplace")). En dehors de ces snafus, XML est assez régulière que vous n'avez pas besoin d' une bibliothèque spéciale pour l' écrire. Si le document est trop compliqué d'écrire à la main, alors vous devriez probablement dans l' un des cadres déjà mentionnés. À aucun moment , si vous avez besoin d'écrire un écrivain XML général.

Créé 14/10/2008 à 19:26
source utilisateur

voix
5

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

Il 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 Python, et est très facile à utiliser.

lxml a quelques avantages perfomance, mais ils sont inégaux et vous devriez vérifier les points de repère d'abord pour votre cas d'utilisation.

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

Créé 23/09/2008 à 20:42
source utilisateur

voix
5

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 votre fichier XML entier dans la mémoire à la fois, et ne vous dérange pas traiter des structures de données, et vous regardent beaucoup / la plupart des modèles. Le modèle de saxophone est grande si vous ne vous préoccupez quelques balises, et / ou que vous faites affaire avec de gros fichiers et peut les traiter de manière séquentielle. Le modèle XPath est un peu de chaque - vous pouvez choisir des chemins pour les éléments de données dont vous avez besoin, mais il faut plus de bibliothèques à utiliser.

Si vous voulez simple et emballé avec Python, minidom est votre réponse, mais il est assez boiteux, et la documentation est « est ici docs sur dom, allez comprendre it out ». C'est vraiment agaçant.

Personnellement, j'aime cElementTree, qui est une mise en œuvre plus rapide (base c) de ElementTree, qui est un modèle semblable à dom.

Je l'ai utilisé des systèmes de saxo, et à bien des égards, ils sont plus « pythonique » dans leur sens, mais je finis habituellement la création de systèmes basés sur l'état de les gérer, et de cette façon la folie des mensonges (et bugs).

Je dis aller avec minidom si vous aimez la recherche, ou ElementTree si vous voulez du bon code qui fonctionne bien.

Créé 16/09/2008 à 05:35
source utilisateur

voix
4

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

Créé 31/10/2011 à 15:05
source utilisateur

voix
4

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

Il 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 « correspond à » le schéma.

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

Ceci est une tâche qui récursion fait simple, et je finis avec la bonne structure. Tout cela est fait dans le code python, et est actuellement assez rapide pour une utilisation en production.

Vous pouvez également (relativement) créer facilement des listes ainsi, bien en fonction de votre client, vous pouvez frapper des problèmes à moins que vous donner des conseils de longueur.

Pour moi, ce fut beaucoup plus simple, car un dictionnaire est un moyen beaucoup plus facile de travailler que une classe personnalisée. Pour les livres, la génération XML est beaucoup plus facile que l'analyse syntaxique!

Créé 03/08/2008 à 09:34
source utilisateur

voix
3

Pour un travail sérieux avec XML utilisé Python lxml

Python est livré avec ElementTree construit dans la bibliothèque, mais il étend lxml en termes de vitesse et de fonctionnalité (validation de schéma, l'analyse syntaxique de sax, XPath, diverses sortes de itérateurs et bien d'autres caractéristiques).

Vous devez l'installer, mais dans de nombreux endroits, il est déjà considérés comme faisant partie de l'équipement standard (par exemple Google AppEngine ne permet pas les paquets Python à base C, mais fait exception pour lxml, PyYAML et quelques autres).

Construire des documents XML avec E-usine (de lxml)

Votre question porte sur la construction de document XML.

Avec lxml il y a beaucoup de méthodes et il m'a fallu un certain temps pour trouver celui qui semble être facile à utiliser et aussi facile à lire.

Exemple de code de lxml doc sur l' utilisation de E-usine ( un peu simplifié):


Le E-usine fournit une syntaxe simple et compact pour générer 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>

Je vous remercie de E-usine il des choses suivantes

Code se lit presque comme le document XML résultant

Lisibilité compte.

Permet la création de contenu XML

Prise en charge des choses comme:

  • Les espaces de nommage
  • début et de fin des nœuds de texte à l'intérieur d'un élément
  • fonctions de mise en forme du contenu d'attribut (voir func classe dans l' échantillon complet lxml )

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 la lecture tutoriel lxml - il est très bien écrit et vous donnera beaucoup plus de raisons d'utiliser cette bibliothèque puissante.

Le seul inconvénient de lxml est, qu'il doit être compilé. Voir réponse SO pour plus de conseils comment installer lxml du paquet format roue à l' intérieur fraction de seconde.

Créé 17/04/2014 à 22:32
source utilisateur

voix
3

Personnellement , je pense que le chapitre de la plongée en Python est grand. Assurez -vous que tout d' abord - il utilise le module minidom et est un très bon morceau d'écriture.

Créé 11/08/2008 à 19:02
source utilisateur

voix
3

Puisque vous avez mentionné que vous allez construire XML « assez simple », le module minidom (partie de la bibliothèque standard Python) conviendra probablement à vos besoins. Si vous avez une expérience avec la représentation DOM de XML, vous devriez trouver l'API assez simple.

Créé 02/08/2008 à 19:04
source utilisateur

voix
1

Je pense que vous devriez utiliser lxml pour cette functionallity

Créé 08/10/2014 à 06:58
source utilisateur

voix
1

Je recommande fortement SAX - Simple API for XML - la mise en œuvre dans les bibliothèques Python. Ils sont assez faciles à installer et à grand processus XML par l'API même conduit, comme discuté par les commentaires précédents ici, et ont faible empreinte mémoire contrairement à la validation de parseurs XML de style DOM.

Créé 12/12/2012 à 04:25
source utilisateur

voix
1

Si vous allez à la construction des messages SOAP, consultez soaplib . Il utilise ElementTree sous le capot, mais il fournit une interface beaucoup plus propre pour la sérialisation et les messages désérialisation.

Créé 13/10/2008 à 23:17
source utilisateur

voix
1

Je suppose que le XML .NET mode de traitement se base sur la version'som de MSXML et ce cas, je suppose que l'utilisation par exemple minidom vous ferait sentir un peu à la maison. Cependant, si elle est simple traitement que vous faites une bibliothèque fera probablement.

Moi aussi préfère travailler avec ElementTree en traitant avec xml en Python, il est une bibliothèque très soignée.

Créé 16/09/2008 à 07:20
source utilisateur

voix
1

J'ai récemment commencé à utiliser Amara avec succès.

Créé 11/08/2008 à 23:40
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more