Verwenden von ElementTree, um einen XML-String mit einem Namespace zu analysieren

Ich habe meine Hose gepeitscht. Was ich versuche zu tun ist ganz einfach: Ich möchte auf den UniqueID-Wert in dem folgenden XML in einem String mit ElementTree zugreifen.

from xml.etree.ElementTree import fromstring xml_string = """<ListObjectsResponse xmlns='http://www.example.com/dir/'> <Item> <UniqueID>abcdefghijklmnopqrstuvwxyz0123456789</UniqueID> </Item> </ListObjectsResponse>""" NS = "http://www.example.com/dir/" tree = fromstring(xml_string) 

Ich weiß, dass ich die fromstring Methode verwenden sollte, um den XML-String zu analysieren, aber ich kann nicht scheinen zu identifizieren, wie man auf die UniqueID zugreifen kann. Ich bin nicht sicher, wie man die findall , findtext oder findtext Methoden in Bezug auf den Namespace benutzt.

Jede Hilfe ist total geschätzt.

2 Solutions collect form web for “Verwenden von ElementTree, um einen XML-String mit einem Namespace zu analysieren”

Das folgende soll dich gehen:

 >>> tree.findall('*/*') [<Element '{http://www.example.com/dir/}UniqueID' at 0x10899e450>] 

Dies listet alle Elemente auf, die zwei Ebenen unterhalb der Wurzel deines Baumes sind (das UniqueID-Element in deinem Fall). Sie können alternativ nur das erste Element auf dieser Ebene finden, mit tree.find() . Sie können dann direkt den Textinhalt des UniqueID-Elements erhalten:

 >>> unique_id_elmt = tree.find('*/*') # First (and only) element two levels below the root >>> unique_id_elmt <Element '{http://www.example.com/dir/}UniqueID' at 0x105ec9450> >>> unique_id_elmt.text # Text contained in UniqueID 'abcdefghijklmnopqrstuvwxyz0123456789' 

Alternativ können Sie direkt ein genaues Element finden, indem Sie den vollständigen Pfad angeben :

 >>> tree.find('{{{0}}}Item/{{{0}}}UniqueID'.format(NS)) # Tags are prefixed with NS <Element '{http://www.example.com/dir/}UniqueID' at 0x10899ead0> 

Wie Tomalak anzeigte, könnte die Website von Fredrik Lundh nützliche Informationen enthalten. Sie wollen überprüfen, wie Präfixe behandelt werden können: Es könnte in der Tat ein einfacher Weg, um sie zu behandeln, als indem Sie explizit den NS Pfad in der oben genannten Methode.

Ich weiß, es wird ein paar Schreie von Horror und Downvotes für meine Antwort als Vergeltung sein, denn ich benutze Modul re , um eine XML-String zu analysieren, aber beachten Sie, dass:

  • In der Mehrzahl der Fälle wird die folgende Lösung kein Problem verursachen

  • Ich wünschte, die Downvoter geben Beispiele für Fälle, die Probleme mit meiner Lösung verursachen

  • Ich analysiere nicht die Zeichenkette und nimm das Wort "Parse" im Sinne von "einen Baum zu erhalten, bevor ich den Baum analysiere, um zu finden, was gesucht wird"; Ich analysiere es: Ich finde direkt den wütenden Teil des Textes, wo es ist

Ich behaupte nicht, dass ein XML-String immer mit Hilfe von re analysiert werden muss. Es ist wahrscheinlich in der Mehrzahl der Fälle, dass ein XML-String mit einem dedizierten Parser analysiert werden muss. Ich sage nur, dass in einfachen Fällen wie diesem, in denen eine einfache und schnelle Analyse möglich ist, ist es einfacher, das Regex-Tool zu verwenden, das übrigens schneller ist.

 import re xml_string = """<ListObjectsResponse xmlns='http://www.example.com/dir/'> <Item> <UniqueID>abcdefghijklmnopqrstuvwxyz0123456789</UniqueID> </Item> </ListObjectsResponse>""" print xml_string print '\n=================================\n' print re.search('<UniqueID>(.+?)</UniqueID>', xml_string, re.DOTALL).group(1) 

Ergebnis

 <ListObjectsResponse xmlns='http://www.example.com/dir/'> <Item> <UniqueID>abcdefghijklmnopqrstuvwxyz0123456789</UniqueID> </Item> </ListObjectsResponse> ================================= abcdefghijklmnopqrstuvwxyz0123456789 
  • Python-Funktion für XML-Liste
  • XML Unicode-Strings mit Codierungsdeklaration werden nicht unterstützt
  • Analysieren Sie mehrere XML-Deklarationen in einer Datei mit Hilfe von lxml.etree.iterparse
  • Überschneide den Seifenumschlag in Suds python
  • Bearbeiten von XML als Wörterbuch in Python?
  • Lazy SAX XML Parser mit Stop / Resume
  • Iterparse wirft 'kein Element gefunden: Zeile 1, Spalte 0' und ich bin mir nicht sicher, warum
  • Skript, um Unicode-Zeichen in <U9999> Format in ihre ASCII-Äquivalente zu konvertieren
  • Parsing XML mit schöner Suppe
  • Parsing xml to pandas Datenrahmen wirft Speicherfehler
  • Element.tagName für python funktioniert nicht
  • Python ist die beste Programmiersprache der Welt.