Ich habe viele Zeilen in einer Datenbank, die XML enthält, und ich versuche, ein Python-Skript zu schreiben, um Instanzen eines bestimmten Knotenattributs zu zählen.
Mein Baum sieht aus wie:
<foo>
<bar>
<type foobar="1"/>
<type foobar="2"/>
</bar>
</foo>
Wie kann ich mit Python auf die Attribute "1"
und "2"
im XML zugreifen ?
Antworten:
Ich schlage vor
ElementTree
. Es gibt andere kompatible Implementierungen derselben API, z. B.lxml
undcElementTree
in der Python-Standardbibliothek selbst. In diesem Zusammenhang wird jedoch hauptsächlich noch mehr Geschwindigkeit hinzugefügt - die einfache Programmierung hängt von der API ab, dieElementTree
definiert.Erstellen Sie zuerst eine Elementinstanz
root
aus dem XML, z. B. mit der XML- Funktion, oder analysieren Sie eine Datei mit folgenden Elementen :Oder eine der vielen anderen Möglichkeiten, die unter gezeigt werden
ElementTree
. Dann mach so etwas wie:Und ähnliche, normalerweise ziemlich einfache Codemuster.
quelle
lxml
fügt mehr als Geschwindigkeit hinzu. Es bietet einfachen Zugriff auf Informationen wie den übergeordneten Knoten, die Zeilennummer in der XML-Quelle usw., die in verschiedenen Szenarien sehr nützlich sein können.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
ist am schnellsten und ziemlich einfach.XML:
Python:
Ausgabe:
quelle
item
direkt von der obersten Ebene des Dokuments findet? Wäre es nicht sauberer, wenn Sie ihm den Pfad (data->items
) geben würden? denn was wäre, wenn Sie auchdata->secondSetOfItems
Knoten hättenitem
und nur einen der beiden Sätze auflisten wolltenitem
?Sie können BeautifulSoup verwenden :
quelle
BeautifulStoneSoup
ist DEPECIATED. VerwendenBeautifulSoup(source_xml, features="xml")
ElementTree
. Leider kann es nicht analysiert werden , es sei denn, ich passe die Quelle an bestimmten Stellen an, habe aberBeautifulSoup
sofort ohne Änderungen gearbeitet!Es gibt viele Möglichkeiten da draußen. cElementTree sieht hervorragend aus, wenn Geschwindigkeit und Speichernutzung ein Problem darstellen. Es hat sehr wenig Aufwand im Vergleich zum einfachen Einlesen der Datei mit
readlines
.Die relevanten Metriken finden Sie in der folgenden Tabelle, die von der cElementTree- Website kopiert wurde :
Wie von @jfs hervorgehoben , wird
cElementTree
Python mitgeliefert:from xml.etree import cElementTree as ElementTree
.from xml.etree import ElementTree
(Die beschleunigte C-Version wird automatisch verwendet).quelle
from xml.etree import cElementTree as ElementTree
. Auf Python 3:from xml.etree import ElementTree
(die beschleunigte C-Version wird automatisch verwendet)ElementTree
für eine bestimmte Aufgabe verwendet. Für Dokumente, die in den Speicher passen, ist die Verwendung viel einfacherminidom
und funktioniert für kleinere XML-Dokumente einwandfrei.Der Einfachheit halber schlage ich xmltodict vor .
Es analysiert Ihr XML in ein OrderedDict.
quelle
result["foo"]["bar"]["type"]
handelt es sich um eine Liste aller<type>
Elemente, sodass es immer noch funktioniert (obwohl die Struktur möglicherweise etwas unerwartet ist).lxml.objectify ist wirklich einfach.
Nehmen Sie Ihren Beispieltext:
Ausgabe:
quelle
count
speichert die Anzahl der einzelnen Elemente in einem Wörterbuch mit Standardschlüsseln, sodass Sie nicht nach einer Mitgliedschaft suchen müssen. Sie können auch versuchen, zu betrachtencollections.Counter
.Python hat eine Schnittstelle zum Expat-XML-Parser.
Es ist ein nicht validierender Parser, sodass schlechtes XML nicht abgefangen wird. Aber wenn Sie wissen, dass Ihre Datei korrekt ist, ist dies ziemlich gut, und Sie erhalten wahrscheinlich genau die gewünschten Informationen, und Sie können den Rest sofort verwerfen.
quelle
Ich könnte declxml vorschlagen .
Vollständige Offenlegung: Ich habe diese Bibliothek geschrieben, weil ich nach einer Möglichkeit gesucht habe, zwischen XML- und Python-Datenstrukturen zu konvertieren, ohne Dutzende von Zeilen imperativen Parsing- / Serialisierungscodes mit ElementTree schreiben zu müssen.
Mit declxml verwenden Sie Prozessoren , um die Struktur Ihres XML-Dokuments deklarativ zu definieren und um zwischen XML- und Python-Datenstrukturen zuzuordnen. Prozessoren werden sowohl für die Serialisierung und Analyse als auch für eine grundlegende Validierungsstufe verwendet.
Das Parsen in Python-Datenstrukturen ist einfach:
Welches erzeugt die Ausgabe:
Sie können denselben Prozessor auch zum Serialisieren von Daten in XML verwenden
Welches erzeugt die folgende Ausgabe
Wenn Sie mit Objekten anstelle von Wörterbüchern arbeiten möchten, können Sie Prozessoren definieren, um Daten auch von und zu Objekten zu transformieren.
Welches erzeugt die folgende Ausgabe
quelle
Um eine weitere Möglichkeit hinzuzufügen, können Sie entwirren verwenden , da es sich um eine einfache XML-zu-Python-Objektbibliothek handelt. Hier haben Sie ein Beispiel:
Installation:
Verwendungszweck:
Ihre XML-Datei (etwas geändert):
Zugriff auf die Attribute mit
untangle
:Die Ausgabe wird sein:
Weitere Informationen zum Entwirren finden Sie unter " Entwirren ".
Wenn Sie neugierig sind, finden Sie unter " Python und XML " eine Liste der Tools für die Arbeit mit XML und Python . Sie werden auch sehen, dass die häufigsten in früheren Antworten erwähnt wurden.
quelle
Hier ein sehr einfacher aber effektiver Code mit
cElementTree
.Dies ist aus " Python XML Parse ".
quelle
XML:
Python-Code:
Ausgabe:
quelle
Dadurch wird der Wert des
foobar
Attributs gedruckt .quelle
xml.etree.ElementTree vs. lxml
Dies sind einige Vorteile der beiden am häufigsten verwendeten Bibliotheken, die ich kennen sollte, bevor ich mich zwischen ihnen entscheide.
xml.etree.ElementTree:
lxml
standalone="no"
?.node
.sourceline
Ermöglicht das einfache Abrufen der Zeile des von Ihnen verwendeten XML-Elements.quelle
Ich finde die Python xml.dom und xml.dom.minidom ziemlich einfach. Denken Sie daran, dass DOM nicht für große Mengen an XML geeignet ist. Wenn Ihre Eingabe jedoch relativ klein ist, funktioniert dies einwandfrei.
quelle
Es ist nicht erforderlich, eine lib-spezifische API zu verwenden, wenn Sie diese verwenden
python-benedict
. Initialisieren Sie einfach eine neue Instanz aus Ihrem XML und verwalten Sie sie einfach, da es sich um einedict
Unterklasse handelt.Die Installation ist einfach:
pip install python-benedict
Es unterstützt und normalisiert I / O - Operationen mit vielen Formaten:
Base64
,CSV
,JSON
,TOML
,XML
,YAML
undquery-string
.Es ist gut getestet und Open Source auf GitHub .
quelle
quelle
Wenn die Quelle eine XML-Datei ist, sagen Sie wie in diesem Beispiel
Sie können den folgenden Code versuchen
Ausgabe wäre
quelle