Seite 1 von 1

nodelist in XML schreiben

Verfasst: Freitag 23. November 2007, 12:35
von marlboro1980
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 ?

Verfasst: Freitag 23. November 2007, 13:09
von windner
Die built-in-function str() macht strings aus so gut wie allem.

Re: nodelist in XML schreiben

Verfasst: Freitag 23. November 2007, 13:17
von gerold
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
:-)

Verfasst: Freitag 23. November 2007, 13:20
von 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.

Verfasst: Freitag 23. November 2007, 14:24
von marlboro1980
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.

Verfasst: Freitag 23. November 2007, 15:09
von 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.

Verfasst: Freitag 23. November 2007, 15:53
von marlboro1980
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.

Verfasst: Freitag 23. November 2007, 16:02
von 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?

Verfasst: Freitag 23. November 2007, 16:10
von marlboro1980
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.

Verfasst: Freitag 23. November 2007, 17:26
von 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.