XML Datei richtig auslesen

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
HarryPython
User
Beiträge: 60
Registriert: Freitag 8. Juni 2007, 07:39

Hi

Ich beschäftige mich seit 2 Tagen mit XML. Da meine XML-Dateien recht groß sind hab ich zu cElementTree gegriffen was auch schon ganz gut klappt.

1.Nun frag ich mich ob es nicht eine einfachere Lösung gibt als immer mit getchildren an das gewünschte Element zu kommen

2. arbeitet die XML-Datei mit Name-Space. Wie kann ich es umgehen, dass ich bei find nicht immer {http://auto.com} mit angeben muss? Oder muss er bei der Suche immer dabei sein, gerade damit man gleichnamige Elemente auseinander halten kann?

Alles in allem suche ich einfach eine schönere Lösung möchte aber bei cElementTree bzw minidom bleiben.

PS: Auf das XML-File hab ich leider kein Einfluss.

Danke für Vorschläge und Kritik


Hier der Anfang meines XML-Files:

Code: Alles auswählen

   <?xml version="1.0" encoding="UTF-8" ?> 
   <!--  Exported from ToolSuite --> 
- <AUTOxsi:schemaLocation="http://auto.com auto.xsd"   
    xmlns="http://auto.com"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  - <TOP-LEVEL>
    - <PACKAGE>
        <SHORT-NAME>David</SHORT-NAME> 
      - <ELEMENTS>
        - <EC>
            <SHORT-NAME>An</SHORT-NAME> 
          </ECU>
        - <EC>
            <SHORT-NAME>BA</SHORT-NAME> 
          </EC>
        - <EC>
            <SHORT-NAME>BC</SHORT-NAME> 
          </EC>


Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-


from xml.etree import cElementTree 


auto = cElementTree.parse("File.xml").getroot()

top_level = auto.getchildren()[0] 

package = top_level.getchildren()

elements = package[0].getchildren()[1]

ec = elements.findall("{http://auto.com}EC")

for i in ec:
    print i.find("{http://auto.com}SHORT-NAME").text 

Code: Alles auswählen

An
BA
BC
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Hast du dir mal die XPath-Syntax angesehen? Damit kannst du alle Short-Name-Elemente finden lassen, ohne erst manuell den Baum abklappern zu müssen. Schau dafür mal auf der ElementTree-Seite des Autors (Fredrik "effbot" Lundh).
HarryPython
User
Beiträge: 60
Registriert: Freitag 8. Juni 2007, 07:39

Ja genau das wars was ich gesucht habe. Das doch schon mal viel schöner und nun kann sich auch schonmal der Anfang der Datei ändern ohne das ich gleich ein neues Programm schreiben muss. Danke

Was ich mich jetzt noch frage ist wie bekomme ich das http://auto.com unter den find-Befehlen weg?

Hier nun die Kurzversion:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: ISO-8859-1 -*-


from elementtree import ElementTree



auto = ElementTree.parse("File.xml")

ec = auto.findall("//{http://auto.com}ECU")
for i in ec:
    print i.find("{http://auto.co}SHORT-NAME").text
BlackJack

Wie Du ja schon selbst gesagt hast, dienen XML-Namensräume dazu Namensüberschneidungen zu vermeiden. Wenn die Datei Namensräume verwendet, wirst Du die wohl auch angeben müssen.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Hm, bist du sicher, dass du den Namespace mit angeben musst? Schließlich ist das ja der Default-Namespace, daher sollte das unnötig sein.
HarryPython
User
Beiträge: 60
Registriert: Freitag 8. Juni 2007, 07:39

Hi,

ja das hab ich auch gehofft. Aber leider muss ich es immer davor schreiben, sonst kommt eine Fehlermeldung zurück. Finde halt, es macht die ganze Sache auch etwas unübersichtlich und zumal es in der XML Datei auch nicht davor steht. Das aber wahrscheinlich eine Eigenschaft von Namespaces ist die ich nur noch nicht ganz verstanden hab.


Gruß HarryP
Antworten