Python3 - Aus XML bestimmten tag ausgeben

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
Felix Eckert
User
Beiträge: 31
Registriert: Samstag 10. Juni 2017, 10:53

Hallo,

ich versuche momentan für ein Projekt spezifische tags einer xml auszulesen.
Ich weis allerdings nur wie man alle auf einmal ausgibt (das heißt das ich nicht weis wie man nur einen ausgibt)
Und da ich nicht der "beste" Programmierer bin habe ich keine Ahnung wie ich dies machen könnte.

hier ist die xml

Code: Alles auswählen

<?xml version="1.0" ?>
<DATA>
<name> Max </name>
<nachname> Mustermann </nachname>
</DATA>
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Felix Eckert: die Frage ist halt, wie Du das eine Element identifizieren willst, dann ist das Suchen und Finden auch kein Problem mit `find`. Was hast Du denn schon versucht?
Felix Eckert
User
Beiträge: 31
Registriert: Samstag 10. Juni 2017, 10:53

Das ist ja das ding, ich arbeite sehr wenig mit XML und kenne mich deshalb garnicht mit dem xml package aus :K . aber danke fr den tipp mit find!
UPDATE: Ich habe nun einwenig mit dem find rumprobiert und damit keine Lösung gefunden :(
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Felix Eckert: weil ich nicht verstehe, was Du machen willst, bin ich auch ratlos. Wenn Dir die Beispiele in der Dokumentation nicht weiterhelfen, :K
Felix Eckert
User
Beiträge: 31
Registriert: Samstag 10. Juni 2017, 10:53

Ich habe jetzt ne weile gesucht, habe ne methode auf stackabuse gefunden, musste zwar nen bisschen umplanen aber jetzt funktioniert es :D.
Trotzdem danke für den Tipp!
Felix Eckert
User
Beiträge: 31
Registriert: Samstag 10. Juni 2017, 10:53

Hier der Code für die Leute die auch Probleme haben:

Code: Alles auswählen

from xml.dom import minidom

# XML laden
mydoc = minidom.parse('doc.xml')

items = mydoc.getElementsByTagName('tag_name')

# Eine spezifische Attribute
print(items[0].attributes['name'].value)

# Alle Attribute
for elem in items:  
    print(elem.attributes['Attribute'].value)

# Die Daten von einem Spezifischen tag
print(items[0].firstChild.data)  
print(items[1].childNodes[0].data)

# Alle Daten
for elem in items:  
    print(elem.firstChild.data)
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du solltest statt minidom ElementTree verwenden. Damit ist das arbeiten deutlich einfacher. Unter anderem weil der Whitespace zwischen den Tags nicht einfach auch als DOM-Elemente auftaucht.
Felix Eckert
User
Beiträge: 31
Registriert: Samstag 10. Juni 2017, 10:53

Ich werde nochmals reingucken wie ich das anders machen kann weil das mit der "Navigation" mit Minidom auch umständlich ist.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Felix Eckert: hier das selbe mit ElementTree, wobei das fast exakt so auch in der Dokumentation steht.

Code: Alles auswählen

import xml.etree.ElementTree as et

document = et.ElementTree(file="doc.xml")

# Erstes Element <tag_name>
item = document.find('.//tag_name')

# Eine spezifische Attribute
print(item.attrib['name'])

# Die Daten von einem Spezifischen tag
print(items.text)

# Alle Elemente
items = document.findall('.//tag_name')
for elem in items:
    print(elem.attrib)
    print(elem.text)

# Inhalt von erstem Element
print(document.findtext('.//tag_name'))
Felix Eckert
User
Beiträge: 31
Registriert: Samstag 10. Juni 2017, 10:53

Sirius3 hat geschrieben:@Felix Eckert: hier das selbe mit ElementTree, wobei das fast exakt so auch in der Dokumentation steht.

Code: Alles auswählen

import xml.etree.ElementTree as et

document = et.ElementTree(file="doc.xml")

# Erstes Element <tag_name>
item = document.find('.//tag_name')

# Eine spezifische Attribute
print(item.attrib['name'])

# Die Daten von einem Spezifischen tag
print(items.text)

# Alle Elemente
items = document.findall('.//tag_name')
for elem in items:
    print(elem.attrib)
    print(elem.text)

# Inhalt von erstem Element
print(document.findtext('.//tag_name'))
Vielen dank! Das macht es einfacher mit auslesen! dann habe ich nicht mehr 30 zeilen mit aulese code! :D :D
Antworten