Frage zur XML-Verarbeitung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Steffo
User
Beiträge: 45
Registriert: Sonntag 24. Mai 2009, 19:38

Hallo,
ich versuche mich gerade an einem einfachen Beispiel: Ich will lediglich den Wert eines Attributes eines bestimmten Tags auslesen:

Code: Alles auswählen

import xml.etree.ElementTree as ET

def main():
    tree = ET.parse('Dcm.xdm')

    for elem in tree.findall(".//lst[@name='DcmDspDid']", 'http://www.tresos.de/_projects/DataModel2/06/data.xsd'):
        name = elem.get('name')
        print name
Das Element ist irgendein Kindlement mit Namensraum:

Code: Alles auswählen

<d:lst name="DcmDspDid" type="MAP">...
Der Namensraum wurde am Anfang des Dokuments auch angegeben:

Code: Alles auswählen

xmlns:d="http://www.tresos.de/_projects/DataModel2/06/data.xsd"
Leider wird jedoch gar nichts ausgegeben. Weiß jemand weiter?

Danke im Voraus!

L. G.
Steffo
Zuletzt geändert von Steffo am Dienstag 27. November 2012, 11:09, insgesamt 2-mal geändert.
BlackJack

@Steffo: Das zweite Argument von `findall()` muss eine Abbildung von Name auf Namensraum sein und diesen Namen musst Du in der Suche auch verwenden.

Code: Alles auswählen

    for elememt in tree.findall(
        ".//ns:lst[@name='DcmDspDid']",
        {'ns': 'http://www.tresos.de/_projects/DataModel2/06/data.xsd'}
    ):
        name = elememt.get('name')
        print name
Steffo
User
Beiträge: 45
Registriert: Sonntag 24. Mai 2009, 19:38

Super, danke!!! :D
Steffo
User
Beiträge: 45
Registriert: Sonntag 24. Mai 2009, 19:38

Hallo,
gibt es eine Möglichkeit, dass das gespeicherte XML schön eingerückt wird?
So eine Art toprettyxml() für Element(Tree).

Danke im Voraus!

L. G.
Steffo
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Die lxml-Variante von ElementTree.write hat einen pretty_print-Parameter, ich bin mir nicht sicher, wie es beim xml-Modul aussieht.

Es ist hier übrigens nicht üblich, dass Themen als gelöst markiert werden. Ganz schlecht ist es natürlich, wenn ein Thema als gelöst markiert wird und dann trotzdem noch eine Frage folgt. Eine gute Möglichkeit, um sich sich mögliche Antwortgeber vom Hals zu halten ;-)
Das Leben ist wie ein Tennisball.
Steffo
User
Beiträge: 45
Registriert: Sonntag 24. Mai 2009, 19:38

OK, danke. :)
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Code: Alles auswählen

def ETindent(elem, level=0):
    i = "\n" + level*"  "
    if len(elem):
        if not elem.text or not elem.text.strip():
            elem.text = i + "  "
        if not elem.tail or not elem.tail.strip():
            elem.tail = i
        for el in elem:
            ETindent(el, level+1)
        if not el.tail or not el.tail.strip():
            el.tail = i
    else:
        if level and (not elem.tail or not elem.tail.strip()):
            elem.tail = i
    return elem

pretty_element = ETindent(element)
Antworten