Seite 1 von 1

XML auslesen

Verfasst: Donnerstag 20. Februar 2014, 16:30
von capitalG
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!

Re: XML auslesen

Verfasst: Donnerstag 20. Februar 2014, 16:52
von 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.

Re: XML auslesen

Verfasst: Donnerstag 20. Februar 2014, 17:54
von capitalG
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.

Re: XML auslesen

Verfasst: Donnerstag 20. Februar 2014, 18:29
von 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.

Re: XML auslesen

Verfasst: Freitag 7. März 2014, 19:36
von capitalG
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.

Re: XML auslesen

Verfasst: Freitag 7. März 2014, 19:49
von Sirius3
@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")]

Re: XML auslesen

Verfasst: Freitag 7. März 2014, 21:59
von capitalG
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

Re: XML auslesen

Verfasst: Freitag 7. März 2014, 22:12
von Sirius3
wie sieht denn Dein XML aus?

Re: XML auslesen

Verfasst: Freitag 7. März 2014, 22:40
von capitalG
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.

Re: XML auslesen

Verfasst: Freitag 7. März 2014, 23:07
von Sirius3
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')

Re: XML auslesen

Verfasst: Freitag 7. März 2014, 23:35
von capitalG
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! :)

Re: XML auslesen

Verfasst: Donnerstag 20. März 2014, 14:05
von capitalG
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!

Re: XML auslesen

Verfasst: Donnerstag 20. März 2014, 17:12
von DaftWullie
@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 ;-)

Re: XML auslesen

Verfasst: Donnerstag 20. März 2014, 17:18
von 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>

Re: XML auslesen

Verfasst: Donnerstag 20. März 2014, 22:52
von capitalG
Vielen Dank ihr beiden, jetzt bin ich fertig mit meinem Skript!