XML DOM Geschwisterelemente einfügen

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
T1m1
User
Beiträge: 23
Registriert: Donnerstag 28. Januar 2010, 09:23

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)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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?
T1m1
User
Beiträge: 23
Registriert: Donnerstag 28. Januar 2010, 09:23

Ich kann einen Knoten einfügen des schaff ich ja. Aber einen Knoten für den Knoten schaff ich leider nicht :)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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']]
T1m1
User
Beiträge: 23
Registriert: Donnerstag 28. Januar 2010, 09:23

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]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
T1m1
User
Beiträge: 23
Registriert: Donnerstag 28. Januar 2010, 09:23

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 ;-)
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

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?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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 :)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 :-)
Antworten