J'ai plusieurs lignes dans une base de données qui contient du XML et j'essaie d'écrire un script Python pour compter les instances d'un attribut de nœud particulier.
Mon arbre ressemble à:
<foo>
<bar>
<type foobar="1"/>
<type foobar="2"/>
</bar>
</foo>
Comment puis-je accéder aux attributs "1"
et "2"
au XML en utilisant Python?
Réponses:
Je suggère
ElementTree
. Il existe d'autres implémentations compatibles de la même API, telles quelxml
, etcElementTree
dans la bibliothèque standard Python elle-même; mais, dans ce contexte, ce qu'ils ajoutent principalement est encore plus de vitesse - la facilité de programmation dépend de l'API, quiElementTree
définit.Construisez d'abord une instance Element à
root
partir du XML, par exemple avec la fonction XML , ou en analysant un fichier avec quelque chose comme:Ou l'une des nombreuses autres façons présentées sur
ElementTree
. Ensuite, faites quelque chose comme:Et des modèles de code similaires, généralement assez simples.
la source
lxml
ajoute plus que la vitesse. Il fournit un accès facile aux informations telles que le nœud parent, le numéro de ligne dans la source XML, etc. qui peuvent être très utiles dans plusieurs scénarios.Warning The xml.etree.ElementTree module is not secure against maliciously constructed data. If you need to parse untrusted or unauthenticated data see XML vulnerabilities.
minidom
est le plus rapide et le plus simple.XML:
Python:
Production:
la source
item
directement à partir du niveau supérieur du document? ne serait-il pas plus propre si vous lui fournissiez le chemin (data->items
)? parce que, si vous aviezdata->secondSetOfItems
également des nœuds nommésitem
et que vous vouliez répertorier uniquement l'un des deux ensembles deitem
?Vous pouvez utiliser BeautifulSoup :
la source
BeautifulStoneSoup
est DÉPRÉCIÉ . Il suffit d'utiliserBeautifulSoup(source_xml, features="xml")
ElementTree
, malheureusement il n'est pas en mesure d'analyser à moins que j'ajuste la source à certains endroits mais j'aiBeautifulSoup
travaillé tout de suite sans aucun changement!Il existe de nombreuses options. cElementTree semble excellent si la vitesse et l'utilisation de la mémoire sont un problème. Il a très peu de frais généraux par rapport à la simple lecture du fichier en utilisant
readlines
.Les mesures pertinentes peuvent être trouvées dans le tableau ci-dessous, copié à partir du site Web cElementTree :
Comme souligné par @jfs ,
cElementTree
est livré avec Python:from xml.etree import cElementTree as ElementTree
.from xml.etree import ElementTree
(la version C accélérée est utilisée automatiquement).la source
from xml.etree import cElementTree as ElementTree
. Sur Python 3:from xml.etree import ElementTree
(la version C accélérée est utilisée automatiquement)ElementTree
pour une tâche particulière. Pour les documents qui tiennent en mémoire, c'est beaucoup plus facile à utiliserminidom
et cela fonctionne bien pour les petits documents XML.Je suggère xmltodict pour plus de simplicité.
Il analyse votre XML en un OrderedDict;
la source
result["foo"]["bar"]["type"]
est une liste de tous les<type>
éléments, donc cela fonctionne toujours (même si la structure est peut-être un peu inattendue).lxml.objectify est vraiment simple.
Prendre votre exemple de texte:
Production:
la source
count
stocke le nombre de chaque élément dans un dictionnaire avec des clés par défaut, vous n'avez donc pas à vérifier l'appartenance. Vous pouvez également essayer de regardercollections.Counter
.Python possède une interface avec l'analyseur XML expat.
Il s'agit d'un analyseur non validant, donc le mauvais XML ne sera pas détecté. Mais si vous savez que votre fichier est correct, c'est très bien, et vous obtiendrez probablement les informations exactes que vous souhaitez et vous pouvez supprimer le reste à la volée.
la source
Je pourrais suggérer declxml .
Divulgation complète: J'ai écrit cette bibliothèque parce que je cherchais un moyen de convertir entre les structures de données XML et Python sans avoir besoin d'écrire des dizaines de lignes de code d'analyse / de sérialisation impératif avec ElementTree.
Avec declxml, vous utilisez des processeurs pour définir de manière déclarative la structure de votre document XML et comment mapper entre les structures de données XML et Python. Les processeurs sont utilisés à la fois pour la sérialisation et l'analyse ainsi que pour un niveau de validation de base.
L'analyse dans les structures de données Python est simple:
Ce qui produit la sortie:
Vous pouvez également utiliser le même processeur pour sérialiser les données en XML
Qui produit la sortie suivante
Si vous souhaitez travailler avec des objets au lieu de dictionnaires, vous pouvez également définir des processeurs pour transformer les données vers et depuis les objets.
Qui produit la sortie suivante
la source
Juste pour ajouter une autre possibilité, vous pouvez utiliser démêler , car il s'agit d'une simple bibliothèque d'objets xml en python. Voici un exemple:
Installation:
Usage:
Votre fichier XML (un peu modifié):
Accéder aux attributs avec
untangle
:La sortie sera:
Pour plus d'informations sur le démêlage, voir " démêler ".
De plus, si vous êtes curieux, vous pouvez trouver une liste d'outils pour travailler avec XML et Python dans " Python et XML ". Vous verrez également que les plus courantes ont été mentionnées dans les réponses précédentes.
la source
Voici un code très simple mais efficace à utiliser
cElementTree
.Cela vient de " python xml parse ".
la source
XML:
Code Python:
Production:
la source
Cela affichera la valeur de l'
foobar
attribut.la source
xml.etree.ElementTree contre lxml
Ce sont des avantages des deux bibliothèques les plus utilisées que j'aurais intérêt à connaître avant de choisir entre elles.
xml.etree.ElementTree:
lxml
standalone="no"
?.node
.sourceline
permet d'obtenir facilement la ligne de l'élément XML que vous utilisez.la source
Je trouve le Python xml.dom et xml.dom.minidom assez facile. Gardez à l'esprit que DOM n'est pas bon pour de grandes quantités de XML, mais si votre entrée est assez petite, cela fonctionnera bien.
la source
Il n'est pas nécessaire d'utiliser une API spécifique à la bibliothèque si vous utilisez
python-benedict
. Il suffit d'initialiser une nouvelle instance à partir de votre XML et de la gérer facilement car il s'agit d'unedict
sous - classe.L'installation est simple:
pip install python-benedict
Il soutient et normalise les opérations d' E / S avec de nombreux formats:
Base64
,CSV
,JSON
,TOML
,XML
,YAML
etquery-string
.Il est bien testé et open-source sur GitHub .
la source
la source
Si la source est un fichier xml, dites comme cet exemple
vous pouvez essayer le code suivant
La sortie serait
la source