XML auslesen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
capitalG
User
Beiträge: 14
Registriert: Donnerstag 20. Februar 2014, 16:25

Hi,

ich hab gestern erst mit Python angefangen und ich glaub das ist daher eine ziemliche Basic-Frage, aber ich hänge jetzt seit knapp ner Stunde dran und komm nicht weiter.

Also:
Wie les ich z.B. das author Feld dieser XML aus?
http://gdata.youtube.com/feeds/api/videos/1RN6pT3zL44

Die ganzen Tutorials zeigen das nur anhand von schön geordnetes XMLs. Ich habe bis jetzt eTree benutzt.

Schonmal danke im voraus!
BlackJack

@capitalG: Ich weiss jetzt nicht was ein schön geordnetes XML ist, beziehunsgweise wie eines ungeordnet sein kann. Es muss ja der Spezifikation folgen und aus der Sicht sind alle XML-Dateien gleich.

Oder meinst Du jetzt das es nicht so schön formatiert ist, dass Du die Baumstruktur leicht erkennen kannst? Dann formatier es um oder betrachte es in einem XML-Editor der auch eine Baumansicht bietet. Ein Webbrowser wie Firefox kann da auch schon hilfreich sein. Da dann vielleicht noch zusätzlich Firebug und Firepath installieren. Das sieht man dann schnell das es als XPath ``entry/author/name/text()`` ist.
capitalG
User
Beiträge: 14
Registriert: Donnerstag 20. Februar 2014, 16:25

Vielen Dank für die schnelle Hilfe!
Ich hab mir jetzt das XML Plugin für notepad++ geholt, aber viel übersichtlicher sieht es jetzt auch nicht aus, und die Baumstruktur bringt dort nicht so viel, ich probier mal firebug.

Ich bekomms leider noch immer nicht ausgelesen, irgendwie steig ich bei der Dokumentation ( http://docs.python.org/3.3/library/xml. ... ttree.html )nicht durch, sorry

Code: Alles auswählen

import xml.etree.ElementTree as ET
tree = ET.parse('test.xml')
root = tree.getroot()

print(root.findall("./entry/author/text/"))
Die Konsole spuckt mir immer [] aus, und wenn ich text() benutze gibt es einen Syntax Error. Gibts vieleicht ein deutsches Tutorial/Doku dazu? Über google hab ich nix gefunden.
BlackJack

@capitalG: `text()` geht mit dem ElementTree aus der Standardbibliothek nicht. Da musst Du den letzten Schritt über Python lösen. Oder `lxml.etree` installieren, das kann XPath.
capitalG
User
Beiträge: 14
Registriert: Donnerstag 20. Februar 2014, 16:25

Hi, ich bin jetzt nochmal XML-ETree durchgegangen, aber irgendwie bekomm ich es nicht heraus, wie ich nun einen genauen Wert aus einer XML-Datei auslesen kann, ist dies nun möglich oder nicht? Ich bekomm es nur über root[0][1].text hin, aber ich hätte statt den Zahlen lieber die Zweig-Namen, also sozusagen root[entry][author][name].text . Kann doch eigentlich nicht so schwer sein, das ist doch das intuitivste was man eigentlich mit einer XML machen will.
Kann mir vlt einer einfach den Code hinschreiben, ich probier schon seit 2 Stunden rum und komm einfach nicht weiter.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@capitalG: Dann nimm doch »find«:

Code: Alles auswählen

import xml.etree.ElementTree as ET
tree = ET.parse('test.xml')
root = tree.getroot()
names = [entry.text for entry in root.findall("entry/author/name")]
capitalG
User
Beiträge: 14
Registriert: Donnerstag 20. Februar 2014, 16:25

Danke für die schnelle Antwort. Hatte ich zwischenzeitlich glaub ich auch mal versucht, aber leider ist names dann in dem Fall eine leere Variable wenn ich sie mir über print ausgeben lasse :K
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

wie sieht denn Dein XML aus?
capitalG
User
Beiträge: 14
Registriert: Donnerstag 20. Februar 2014, 16:25

http://gdata.youtube.com/feeds/api/videos/1RN6pT3zL44

BlackJack hat gemeint "entry/author/name/text()" wäre der Pfad um z.B. den Autor auszulesen.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

erstens ist »entry« ja schon Dein Rootelement und zweitens haben alle Tags einen Namespace.

Code: Alles auswählen

name=root.findtext('{http://www.w3.org/2005/Atom}author/{http://www.w3.org/2005/Atom}name')
capitalG
User
Beiträge: 14
Registriert: Donnerstag 20. Februar 2014, 16:25

cool, vielen dank, genau das hab ich gesucht. ich werd das mal auseinandernehmen und mal weiter ausprobieren, aber ich glaub ich habs verstanden wie es funktioniert, perfekt! :)
capitalG
User
Beiträge: 14
Registriert: Donnerstag 20. Februar 2014, 16:25

Hi,
ich hab echt irgendwie mit XML Probleme, ansonsten ist ja Python ja echt eine sehr übersichtliche Sprache. Also, ich habe folgende XML:

Code: Alles auswählen

<?xml version="1.0"?>
<Standard text="test" nummer="123">
<Meta text="test2" nummer="456">
<Meta-ID text="test3" nummer="789" />
</Meta>
</Standard>
Wie verändere ich diese XML, also dass z.B. nummer von Meta-ID in der neue XML nicht mehr 789 ist sondern z.B. 765 und das ganze abgespeichert wird?
Schonmal Vielen Dank im voraus!
DaftWullie
User
Beiträge: 37
Registriert: Donnerstag 17. Mai 2012, 21:28

@capitalG: z.B. so (Python2):

Code: Alles auswählen

import xml.etree.ElementTree as ET

def init_xml():
    return """
<?xml version="1.0"?>
<Standard text="test" nummer="123">
<Meta text="test2" nummer="456">
<Meta-ID text="test3" nummer="789" />
</Meta>
</Standard>
"""

def main():
    serialized = init_xml().strip()
    root = ET.fromstring(serialized)

    meta = root.find('./Meta/Meta-ID')
    meta.attrib['nummer'] = '999'
    print ET.tostring(root)

if __name__ == '__main__':
    main()
Das abspeichern sollte jetzt nicht wirklich schwierig sein, ein einfaches '.write(' statt des print ginge zur Not ;-)
BlackJack

Code: Alles auswählen

In [17]: !cat test.xml
<?xml version="1.0"?>
<Standard text="test" nummer="123">
    <Meta text="test2" nummer="456">
        <Meta-ID text="test3" nummer="789" />
    </Meta>
</Standard>
In [18]: doc = etree.parse('test.xml')

In [19]: doc.find('.//Meta-ID').attrib['nummer'] = '765'

In [20]: doc.write('test2.xml')

In [21]: !cat test2.xml
<Standard nummer="123" text="test">
    <Meta nummer="456" text="test2">
        <Meta-ID nummer="765" text="test3" />
    </Meta>
</Standard>
capitalG
User
Beiträge: 14
Registriert: Donnerstag 20. Februar 2014, 16:25

Vielen Dank ihr beiden, jetzt bin ich fertig mit meinem Skript!
Antworten