Seite 1 von 1

XML DOM Geschwisterelemente einfügen

Verfasst: Donnerstag 28. Januar 2010, 09:33
von T1m1
Hallo Zusammen,

hab schon im Forum gesucht aber leider nichts konkretes gefunden.
Ich weiß, dass es andere möglichkeiten gibt xml datein zu bearbeiten aber ich MUSS Python 2.2 benutzen und da finde ich DOM am besten.

Hier mal mein Baum:

<Ergebnis>
---<Test>
----------<Datum> "13.02.2010"
----------<\Datum>
----------<Pfad> "C:\test\...."
----------<\Pfad>
----------<Name> "Test1"
----------<\Name>
---<Test>
<\Ergebnis>


Ich möchte bei jedem testdurchlauf am ende meines Xml sheets einen test hinzufügen.
Das klappt auch aber jetzt weiß ich leider nicht, wie icih zu dem Test die Tags Datum, Pfad und Name einfüge.

Weiß jemand vielleicht bescheid?

Hier mal mein Übungscode:

Code: Alles auswählen

file = ..\\test_logs\\SubScenario3.log'
test = parse(file)
x = test.createElement("Test")
txt = test.createTextNode("ECD12S")
x.appendChild(txt)
test.childNodes[1].appendChild(x)

Re: XML DOM Geschwisterelemente einfügen

Verfasst: Donnerstag 28. Januar 2010, 09:51
von Hyperion
T1m1 hat geschrieben: Das klappt auch aber jetzt weiß ich leider nicht, wie icih zu dem Test die Tags Datum, Pfad und Name einfüge.
Wenn Du einen Knoten in den DOM-Tree einfügen kannst, wieso kannst Du dann nicht noch mehrere einfügen? Das funktioniert doch analog...

Oder habe ich jetzt Dein Problem missverstanden?

Verfasst: Donnerstag 28. Januar 2010, 09:57
von T1m1
Ich kann einen Knoten einfügen des schaff ich ja. Aber einen Knoten für den Knoten schaff ich leider nicht :)

Verfasst: Donnerstag 28. Januar 2010, 10:23
von Hyperion
T1m1 hat geschrieben:Ich kann einen Knoten einfügen des schaff ich ja. Aber einen Knoten für den Knoten schaff ich leider nicht :)
Das ist doch jetzt nicht Dein Ernst...

... oder doch?

Ok, mal als Denkanstoß:

Code: Alles auswählen

In [3]: root = []

In [4]: child = []

In [5]: child.append("a")

In [6]: child.append("b")

In [7]: child
Out[7]: ['a', 'b']

In [8]: root.append(child)

In [9]: root
Out[9]: [['a', 'b']]

Verfasst: Donnerstag 28. Januar 2010, 11:06
von T1m1
Ja das ist mein Ernst.
Tut mir leid, hab noch nicht viel mit Python zu tun gehabt. Aber ich denk jeder steht mal auf dem Schlauch..


Aber habs jetzt hinbekommen :)

Code: Alles auswählen

file = ..\\test_logs\\SubScenario2.log'
test = parse(file)
x = test.createElement("Scenario")

y = test.createElement("Datum")
txt = test.createTextNode("28.01.2010")
y.appendChild(txt)

g = test.createElement("Pfad")
txt = test.createTextNode("asdfasdf")
g.appendChild(txt)

x.appendChild(y)
x.appendChild(g)

test.childNodes[1].appendChild(x)
ist des so auch okay oder könnten irgentwelche Probleme auftauchen??[/code]

Verfasst: Donnerstag 28. Januar 2010, 11:22
von Hyperion
T1m1 hat geschrieben:Ja das ist mein Ernst.
Tut mir leid, hab noch nicht viel mit Python zu tun gehabt. Aber ich denk jeder steht mal auf dem Schlauch..
Ich wollte auch nicht so ruppig rüberkommen, sorry :-)

Code: Alles auswählen

file = '..\\test_logs\\SubScenario2.log'
test = parse(file)
x = test.createElement("Scenario")

y = test.createElement("Datum")
txt = test.createTextNode("28.01.2010")
y.appendChild(txt)

g = test.createElement("Pfad")
txt = test.createTextNode("asdfasdf")
g.appendChild(txt)

x.appendChild(y)
x.appendChild(g)

test.childNodes[1].appendChild(x)
Man könnte noch auf einige Bindungen verzichten, wenn man die nicht noch braucht:

Code: Alles auswählen

g = test.createElement("Pfad")
g.appendChild(test.createTextNode("asdfasdf"))
Außerdem Pfade immer als Raw-Strings angeben:

Code: Alles auswählen

filename = r'..\test_logs\SubScenario2.log'
Zudem solltest Du das nicht file, sondern besser file nennen, da Du damit ein built-in überschreibst. Zudem ist es ja auch kein file like Object, sondern ein String mit dem Dateinamen ;-)
ist des so auch okay oder könnten irgentwelche Probleme auftauchen??
Probleme inwiefern? Allerhöchstens in Sachen Codierung... Du kreierst die Knoten ja aus Bytes und nicht Unicode. Allerdings weiß ich nicht aus dem Kopf, wie das bei Python 2.2 und dem DOM-Modul aussah.

Verfasst: Donnerstag 28. Januar 2010, 13:48
von T1m1
Haja kein Problem.

Der Variablenname file war nur als test, benutze andere namen.

Die Bindungen hab ich ersetzt .. genau solche Infos wollte ich ^^

Und kannst du mir vielleicht kurz erklären was und warum als Raw-String??

Vielen Dank für deine Bemühung

Verfasst: Donnerstag 28. Januar 2010, 14:20
von Hyperion
T1m1 hat geschrieben: Und kannst du mir vielleicht kurz erklären was und warum als Raw-String??
http://docs.python.org/reference/lexica ... #index-994
Kurz gesagt unterdrückt das "r" vor dem String-Literal die Auswertung von Escape-Sequenzen, die sich gerne als Trenner bei Pfadnamen finden ;-)

Verfasst: Donnerstag 28. Januar 2010, 16:36
von derdon
Hyperion hat geschrieben:Zudem solltest Du das nicht file, sondern besser file nennen, da Du damit ein built-in überschreibst.
Ich hab mir den Satz gefühlte 10 mal durchgelesen, aber immer noch nicht verstanden. Hast du dich vielleicht verschrieben?

Verfasst: Donnerstag 28. Januar 2010, 16:49
von cofi
derdon hat geschrieben:Ich hab mir den Satz gefühlte 10 mal durchgelesen, aber immer noch nicht verstanden. Hast du dich vielleicht verschrieben?
Wie? Nur 10x? Das ist doch rekursiv! (ohne Rekursionsanker :roll:) :twisted:

Ich werfe mal `file_path` und `fpath` in den Ring :)

Verfasst: Freitag 29. Januar 2010, 06:30
von Hyperion
derdon hat geschrieben:
Hyperion hat geschrieben:Zudem solltest Du das nicht file, sondern besser file nennen, da Du damit ein built-in überschreibst.
Ich hab mir den Satz gefühlte 10 mal durchgelesen, aber immer noch nicht verstanden. Hast du dich vielleicht verschrieben?
*hust* Ja, habe ich :oops:
Ich wollte filename schreiben - aber cofi hat ja auch ein paar gute Varianten genannt :-)