2013-06-30 17 views
6

ich curently auf einem IRC Bot arbeite und wollen die Konfiguration aus einer XML-Datei abzurufen, die wie folgt aussehen:Python XML Minidom Get Element nach Tag in untergeordneten Knoten

<server> 
    <host> HOST1 </host> 
    <port> 6667 </port> 
    <channel> 
    <name> CHANNAME1</name> 
    </channel> 
    <channel> 
    <name> CHANNAME2 </name> 
    </channel> 
</server> 
<server> 
    <host> HOST2 </host> 
    <port> 6667 </port> 
    <channel> 
    <name> CHANNAME3 </name> 
    </channel> 
</server> 

Und mein Code sieht wie folgt aus:

doc = minidom.parse(xml) 
node = doc.documentElement 
servers = doc.getElementsByTagName("server") 

for server in servers: 

    channels = server.getElementsByTagName("channel") 
    host = server.getElementsByTagName("host")[0].childNodes[0].data 
    print host 

    for channel in channels: 
     NAME = channel.getElementsByTagName("name")[0].childNode[0].data 
     print NAME 

Und der Ausgang ist

HOST1 
CHANNAME1 
CHANNAME2 
CHANNAME3 
HOST2 
CHANNAME1 
CHANNAME2 
CHANNAME3 

Aber alles was ich brauche ist

Gibt es eine Möglichkeit, alle Elemente mit dem Tag-Namen "channel" in meinem Node-Server anstelle der gesamten XML-Datei zu erhalten?

+1

'firstChild' ist ein Alias ​​von' childnodes [0] ', für die Bequemlichkeit – JVE999

Antwort

4

Ihr Code sieht korrekt aus. Sie haben childNode, wenn es childNodes in der NAME Zuordnung sein sollte, aber ich nehme an, dass das nur ein Tippfehler in Ihrer Frage ist.

Ihr XML ist jedoch nicht gültig. Sie müssen eine Art Root-Knoten haben, der die Server umhüllt. Wie es derzeit geschrieben wird, würde ich nicht erwarten, dass es sogar erfolgreich analysiert. Es sollte wie folgt aussehen:

<servers> 
    <server> 
    <host> HOST1 </host> 
    <port> 6667 </port> 
    <channel> 
     <name> CHANNAME1</name> 
    </channel> 
    <channel> 
     <name> CHANNAME2 </name> 
    </channel> 
    </server> 
    <server> 
    <host> HOST2 </host> 
    <port> 6667 </port> 
    <channel> 
     <name> CHANNAME3 </name> 
    </channel> 
    </server> 
</servers> 

Mit diesem XML und der Code, den Sie zur Verfügung gestellt haben, bekomme ich die genaue Ausgabe, die Sie erwarten.

+0

Es war nur ein Fehler von meiner Seite: Es kann subtree sucht viel besser handhaben. Vielen Dank für Ihre Antwort –

3

Verwenden Sie nicht das Minidom. Verwenden Sie stattdessen die ElementTree API.

from xml.etree import ElementTree as ET 

doc = ET.parse(xmlfile).getroot() 

for server in doc.findall('server'): 
    host = server.find('./host').text 
    print host 
    for channel in server.findall('channel'): 
     name = channel.find('name').text 
     print name 
Verwandte Themen