Probleme beim einlesen einer XML Datei mit xml.dom.minidom

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
fl0
User
Beiträge: 11
Registriert: Donnerstag 11. März 2010, 18:52

Guten Abend,

ich habe ein Problem beim einlesen einer XML Datei, ich bekomme einfach nicht den gewünschten Wert.

Python 2.4.3 (#1, Sep 3 2009, 15:37:37)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-46)] on linux2

So sieht die XML Datei aus:

Code: Alles auswählen

<?xml version="1.0" ?>
<devices>
        <device name='testdevice' ip='3.3.3.3'>
                <config>a</config>
                <config>b</config>
                <config>c</config>
                <config>d</config>
        </device>
        <device name='testdevice1' ip='4.4.4.4'>
                <config>a1</config>
                <config>b2</config>
                <config>c3</config>
                <config>d4</config>
        </device>
</devices>
Folgenden Code verwende ich:

Code: Alles auswählen

#!/usr/bin/env python

import xml.dom.minidom

config = xml.dom.minidom.parse('test.xml')

dev = config.getElementsByTagName('device')

for d in dev:

        print d.getAttribute('name')

        print d.getAttribute('ip')

        for childNode in d.childNodes:

                print childNode.nodeName

Das gibt diese Ausgabe:

Code: Alles auswählen

python xmltest.py 
testdevice
3.3.3.3
#text
config
#text
config
#text
config
#text
config
#text
testdevice1
4.4.4.4
#text
config
#text
config
#text
config
#text
config
#text
Das ist ja prinzipiell richtig, allerdings möchte ich den Inhalt der <config></config> Tags haben, ich habe es mit

Code: Alles auswählen

print childNode.data
versucht, das funktioniert aber nicht..

Code: Alles auswählen

Traceback (most recent call last):
  File "xmltest.py", line 18, in ?
    print childNode.data
AttributeError: Element instance has no attribute 'data'

Kann mir jemand auf die Sprünge helfen?
mfg fl0
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wieso nutzt Du nicht eine hübscheere Lib wie ElementTree? Damit geht so etwas einfacher.

Greifst Du sogar zu lxml, hast Du noch die Möglichkeit auf XPath-Ausdrücke zurückzugreifen.

Edit: Ah, Du nutzt ein ziemliches altes Python. Gibts die Möglichekit da etwas nachzuinstallieren?
fl0
User
Beiträge: 11
Registriert: Donnerstag 11. März 2010, 18:52

Hallo,

ich kann python-lxml 1.3.4 nachinstallieren.
Zuletzt geändert von fl0 am Dienstag 20. April 2010, 20:43, insgesamt 2-mal geändert.
mfg fl0
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Hallo fl0,
deine Ausgabe zeigt es eigentlich schon, du bekommst die untergeordneten Elemente von device ausgegeben. Daraus musst du deine config Knoten ziehen und deren Unterelement vom Typ Text ausgeben. Ist mit dom nicht wirklich schön.

Code: Alles auswählen

#!/usr/bin/env python

import xml.dom.minidom

config = xml.dom.minidom.parse('test.xml')
dev = config.getElementsByTagName('device')

for d in dev:
        print d.getAttribute('name')
        print d.getAttribute('ip')
        for childNode in d.childNodes:
                if childNode.nodeName == 'config':
                    print childNode.firstChild.data
Funktioniert aber nur, wenn die config Elemente keine Zeilenumbrüche und Leerzeichen enthalten. Sonst bekommst du wieder mehrere Childnodes mit Text.

Gruß
Whitie
fl0
User
Beiträge: 11
Registriert: Donnerstag 11. März 2010, 18:52

Danke @Whitie.

Da war ich ja knapp davor, für mich war irgentwie nicht ersichtlich das es sich bei dem Inhalt wieder um ein child handelt...

@Hyperion

lxml werde ich mir trotzdem mal ansehen.
mfg fl0
Antworten