nodelist in XML schreiben

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
marlboro1980
User
Beiträge: 12
Registriert: Donnerstag 22. November 2007, 14:30

Hallo erstmal, ich habe bisher noch nie etwas mit Python gemacht, es wurde mir aber für die Bearbeitung mit XML empfohlen. Hier habe ich folgenden Code entworfen. Ich bitte um Nachsicht, da das ist mein erstes Python-Skript ist. Programieren tue ich zwar schon länger aber mit Python eben noch nicht.

Code: Alles auswählen

from xml.dom import minidom
xmldoc = minidom.parse('/stahl.xml')
reflist = xmldoc.getElementsByTagName('SUPPLIER_AID')
Dann werden mir alle Tags die ich aus dem XML brauche ausgelsen.
Wenn ich nun die reflist über

Code: Alles auswählen

print reflist[0].toxml() 
anspreche gibt er mir den ersten Tag zurück der sich in der liste befindet.

Das sieht dann so aus:
<SUPPLIER_AID>81480000</SUPPLIER_AID>

Nun möchte ich diese Liste in eine Datei schreiben. Das Problem das ich habe ist folgendes.

Code: Alles auswählen

file=open("/test.xml","w")
file.write()
Mit dem Write-Befehl kann ich nur einen string an das File übergeben, aber die reflist ist eine nodelist. Somit kann ich sie so nicht an die Datei überegeben. Wie schreibe ich die Nodelist in das neue XML ?
Zuletzt geändert von marlboro1980 am Freitag 23. November 2007, 14:30, insgesamt 1-mal geändert.
windner
User
Beiträge: 76
Registriert: Freitag 19. Oktober 2007, 11:25

Die built-in-function str() macht strings aus so gut wie allem.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo marlboro1980!

Willkommen im Python-Forum!

Ich möchte dich auf die im Forum eingebauten Code-Tags aufmerksam machen. http://www.python-forum.de/faq.php#21

Du kannst deine Nachricht editieren wenn du auf den Edit-Button im Beitrag klickst.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BlackJack

Wobei das natürlich dann kein gültiges XML ist, wenn man einfach die Nodes in Zeichenkettenform hintereinander in eine Datei schreibt.

Es wäre besser wenn man ein neues Dokument als DOM zusammensetzt. Wie das mit `minidom` funktioniert, kann ich allerdings nicht sagen. Ich bevorzuge `ElementTree` oder `lxml` für XML.
marlboro1980
User
Beiträge: 12
Registriert: Donnerstag 22. November 2007, 14:30

Vielen Dank erstmal für die Antworten. Ich habe halt das Problem, dass mir die Programmierung mit Python völlig neu ist. Zum einen die Importe der Module und Bibliotheken. Um diesen Code zusammenzuschustern habe ich schon eine ganze weile gesessen. Die Logik der meisten anderen Programmiersprachen ist etwas anders. Sonst würde ich es auch z.B. mit Elementtree machen (was ich im übrigen schon probiert habe) aber leider zu keinem Ergebnis gekommen bin

Edith sagt:

Könnte ich nicht über eine Schleife den Inhalt der reflist aufrufen ? z.B:

Code: Alles auswählen

while(i <= max)
print reflist[i].toxml()
file.write lastline 
i = i-1
Das Problem das ich dabei habe ist das ich nicht weiss wie ich an den Größten Wert in der reflist rankomme. und wie ich die letzte ausgegebene Linie in die Datei schreiben kann.
BlackJack

Kleiner Codeschnippsel mit ElementTree (hier als `etree` importiert):

Code: Alles auswählen

def main():
    tree = etree.parse('test.xml')
    new_root = etree.Element('spam')
    for node in tree.findall('//repositoryItem'):
        new_root.append(node)
    print etree.tostring(new_root)
Aber ich denke Du solltest das mit dem XML erst einmal bleiben lassen und Python lernen. Die Grunddatentypen wie Listen und wie man darüber in einer ``for``-Schleife iteriert und wie man Dateien öffnet und Daten liest und schreibt, sollte man schon kennen bevor man etwas anspruchsvolleres machen möchte.

Arbeite am Besten mal das Tutorial in der Dokumentation durch.
marlboro1980
User
Beiträge: 12
Registriert: Donnerstag 22. November 2007, 14:30

Die Zieldatei muss auch nicht unbedingt ein XML sein. es würde mir auch reichen wenn er mir die Tags hintereinander in ein TXT-FILE reinschreibt die XML-Struktur muss nicht mehr vorhanden sein, da die Daten im Anschluss sowieso in ein XLS importiert werden. Das Grundproblem das ich eigentlich habe ist, dass das XML-FILE 300.000 Zeilen hat und ich ein neues File mit verdichteten Informationen brauche.
In dem Original-FILE habe ich z.B. TAGS a,b,c,d,d,d,d,d,e,f,f,f,f,,g,h,i,j,k und im neuen FILE möchte ich nur noch TAGS a,d,f .... a,d,f ...a,d,f ... haben.
BlackJack

Wie soll dass denn in Excel importiert werden? Da muss doch auch eine gewisse Struktur in den neuen Daten sein. Zum Beispiel als CSV-Datei, also gänzlich ohne Tags, oder?
marlboro1980
User
Beiträge: 12
Registriert: Donnerstag 22. November 2007, 14:30

So stelle ich mir das ungefähr vor:

1 <SUPPLIER_AID>123456</SUPLLIER_AID>
2 <DESCRIPTON_SHORT>Das ist ein TEST<DESCRIPTION_SHORT>
3 <DESCRIPTION_LONG>Das ist ein lnager text</DESCRIPTION_LONG>

4 <SUPPLIER_AID>666666</SUPLLIER_AID>
5 <DESCRIPTON_SHORT>Das ist ein TEST333<DESCRIPTION_SHORT>
6 <DESCRIPTION_LONG>Das ist ein lnager text3</DESCRIPTION_LONG>

So könnte es dann aussehen oder ohne Tags. Wichtig wäre nur das er eine neue Zeile beginnt. Meine rudimentäre Programmierlogik sagt mir das ich das ich wie im Post obendrüber über eine while -schleife bauen würde die mir aus Liste 1 den ersten wert herausholt aus Liste 2 den den ersten Wert usw.
BlackJack

Wie gesagt, arbeite das Tutorial durch. Das sagt nämlich das eine ``for``-Schleife über die Liste viel kürzer und einfacher ist und ohne expliziten Index auskommt. Schau Dir die Schleife in meinem Quelltextschnippsel weiter oben an.

Ansonsten denke ich, müsstest Du Dir noch klar machen, dass XML eine Baumstruktur ist. Ich vermute mal die drei Elemente, die Dich interessieren gehören zusammen und haben einen gemeinsamen Elternknoten. Von der Logik her müsstest Du also über diese Elternknoten iterieren, jeweils die drei Elemente herausholen und in eine Datei schreiben. Wenn das in eine Tabelle soll, ist CSV vielleicht wirklich ein gutes Format. Es gibt ein `csv`-Modul in der Standardbibliothek.
Antworten