XML editieren

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.
juju
User
Beiträge: 47
Registriert: Dienstag 25. Mai 2010, 16:02

halllo leute...

versuche nun eine XML-Datei zu editieren:

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>
<Pipi>
 <Sonne uid="bee035c5-03f6-4e9c-94b9-31f0fc484db1">
  <Format>hell</Format>
  <ID="23399999" name="Johann Ulbricht" sex="" birthDate="2009-03-30"/>
  <ToDo="Mr. Phantomdoctor" dateTime="2007-01-23T13:52:27.2343750+01:00"/>
  <Raum="Room1" projectile="9mm" charge="1" mass="1" atomicNumber="We"/>
  <Filter="254" rangeShifter="3" rangeShifterDistance="20"/>
  <Rollen="0" Pitch="0" Lateral="150" longitudinal="-400" angle="0" blalba="-100.5"/>
  <super angle="90"/>
   <SEI number="1" Summe="64.05" Absatz="25">
    <Hamster a="-24" b="28" pa="1405180"/>
    <Hamster a="-20" b="28" pa="1403920"/>
   <SEI/>
  <Sonne/>
 <Pipi/>
Ziel ist es in den "Hamster"-Tags die "a"- und "b"- Werte jeweils mit einer Intzahl zu addieren und mit diesen neuen Werte eine neue XML-Datei zu schreiben (identischer Aufbau mit veränderten Werten).

Gibt es vllt eine Möglichkeit, die Datei einfach umzuschreiben, also sich das Schreiben einer neuen XMLDatei zu sparen??
hat da jemand zufällig Erfahrung mit?

PS.: Ich erwarte (bitte) keine Lösung der Aufgabe...basteln möchte ich gerne selbst...
BlackJack

@juju: Wo ist denn jetzt das genaue Problem? Ausser dass das kein gültiges XML ist -- hoffe mal das sind nur Tippfehler mit den inkorrekten schliessenden Tags.

Du musst halt eine XML-Bibliothek nehmen, `lxml` bietet sich an, über die Hamster-Elemente iterieren und die Werte anpassen. Und dann die Datei wieder schreiben. "In place" geht das in der Regel nicht, Du wirst schon eine neue Datei schreiben müssen.

Edit: Es sind nicht nur die End-Tags sondern auch so etwas wie ``<Tagname="Wert"…>`` was kein gültiges XML ist.
juju
User
Beiträge: 47
Registriert: Dienstag 25. Mai 2010, 16:02

nein leider sind das keine Tipfehler!! Die Datei ist genauso aufgebaut...
aber danke schonmal für die Info (editieren in place)...
BlackJack

@juju: Wenn die Datei genau so aufgebaut ist, dann ist es kein XML. Wer sich das ausgedacht hat, gehört geteert und gefedert. :evil:
juju
User
Beiträge: 47
Registriert: Dienstag 25. Mai 2010, 16:02

@blackjack: hahahahhaah :D ... so sehe ich das auch... kann nur soviel dazu sagen: Da steckt nicht nur einer dahinter...
naja werde dann wohl mit re arbeiten müssen :( ...dreck
problembär

Solange das XML nicht wohlgeformt ist, kannst Du da Werte verändern wie Du willst, am Ende wird niemand mit der Datei etwas anfangen können.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

juju hat geschrieben:@blackjack: hahahahhaah :D ... so sehe ich das auch... kann nur soviel dazu sagen: Da steckt nicht nur einer dahinter...
Du bleibst hier ein wenig wage... aber evtl. frage die Leute doch mal, was das für ein krudes Format ist und ggf. ob die nicht einen Parser dafür haben? Am besten wäre es, diesen Unsinn wegzuwerfen und ein Standard-Format wie eben XML (oder JSON 8) ) zu nutzen... vielleicht kann man das ja auch durchfrücken.
naja werde dann wohl mit re arbeiten müssen :( ...dreck
Bei verschachtelten Datenstrukturen keine wirklich gute Idee... zumindest, wenn die Daten beliebig verschachtelt auftauchen können.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Hyperion hat geschrieben:Du bleibst hier ein wenig wage... aber evtl. frage die Leute doch mal, was das für ein krudes Format ist und ggf. ob die nicht einen Parser dafür haben? Am besten wäre es, diesen Unsinn wegzuwerfen und ein Standard-Format wie eben XML (oder JSON 8) ) zu nutzen...
Das ganze sieht so aus, als hätte ein unerfahrener Java-Entwickler ein Datenformat geschrieben von dem er glaubte, dass es XML sei.

Wie auch immer, wer ohne Not obskure eigene Formate erfindet sollte dann eigentlich auch Verarbeitungsroutinen dafür bereitstellen. Grundsätzlich schließe ich mich den anderen Schreibern an: Wegschmeißen und als XML neu machen ist die beste Lösung.
juju
User
Beiträge: 47
Registriert: Dienstag 25. Mai 2010, 16:02

nichts desto trotz muss ich an die Daten a und b... hat jemand eine Idee wie das am einfachsten funktionieren könnte??
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

juju hat geschrieben:nichts desto trotz muss ich an die Daten a und b... hat jemand eine Idee wie das am einfachsten funktionieren könnte??
Datei zeilenweise lesen und schreiben. Zwischendurch schauen ob es die Zeile ist die du brauchst. Dann denn passenden Wert rausfummeln und verändern. Fertig.
BlackJack

@juju: Naja, dem Erzeuger sagen er soll entweder valides XML liefern oder Routinen um diesem Murks *sicher* weiterzuverarbeiten.

Alternativ würde ich einen Vorverarbeitungsschritt mit ein wenig "regex-Magie" schreiben, der aus dem Murks XML macht. Was ich in *dem* Fall auf keinen Fall machen würde, wäre wieder solchen Murks als Ausgabeformat schreiben, sondern dann auch korrektes XML. Damit macht man sich selbst und auch anderen die damit nochmal etwas machen müssen, das Leben wesentlich einfacher.

Den Vorverarbeitungsschritt könnte man dann auch versuchen an den Erzeuger zu verschieben, also wieder beim "Idealfall" zu landen, dass man gar nicht erst solchen Murks als Eingabe geliefert bekommt.
juju
User
Beiträge: 47
Registriert: Dienstag 25. Mai 2010, 16:02

ok ok ... ich habe es ja verstanden ... ;)

nächstes Problem:
<SEI number="1" Summe="64.05" Absatz="25">
<Hamster a="-24" b="28" pa="1405180"/>
<Hamster a="-20" b="28" pa="1403920"/>
es gibt nun mehr als ein SEI Tag... untergeordnet gibt es wesentlich mehr als zwei Hamster Tags... wenn ich nun eine neue XML-Datei schreiben möchte, wie schaffe ich es, dass den Hamster Tags nur die entsprechenden SEI Tags zugeordnet werden? ...

hier ein kleiner Auschnitt aus meinem Programm:

Code: Alles auswählen

for ieslist in iesdata:
	Nr = ieslist[0]
	Summe = ieslist[1]
	Absatz = ieslist[2]
   SEI_string = '   <SEI number="%s" Summe="%s" Absatz="%s">\n' % (Nr, Summe, Absatz)
	fobj.write(SEI_string)
   n = 0
   m = 221
	for voxlist in iesvoxeldata[n:m]:
      n = m + 3
      m = n + 222
		a = voxlist[0]
		b = voxlist[1]
		pa = voxlist[2]
		voxelstring ='    <Voxel a="%s" b="%s" pa="%s"/>\n' % (a, b, pa)
		fobj.write(voxelstring)
	fobj.write('    <SEI/>\n')
Der Code macht logischer Weise nicht das was ich möchte... demonstriert und veranschaulicht aber ganz gut, was ich vorhabe: Die Hamstertags haben eine feste Anzahl und Struktur, sowie die IES Tags... meine Überlegung war nun das "durchzuzählen" ... ich weiß; keine elegante Lösung: mit Dict funktioniert es leider nicht... da liste in liste...
hat da jemand eine Idee?

PS.: iesdata = alles SEITags in einer Liste, voxlist = alle Hamstertags in einer Liste
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

juju hat geschrieben:es gibt nun mehr als ein SEI Tag... untergeordnet gibt es wesentlich mehr als zwei Hamster Tags... wenn ich nun eine neue XML-Datei schreiben möchte, wie schaffe ich es, dass den Hamster Tags nur die entsprechenden SEI Tags zugeordnet werden? ...

hier ein kleiner Auschnitt aus meinem Programm:

Code: Alles auswählen

for ieslist in iesdata:
	Nr = ieslist[0]
	Summe = ieslist[1]
	Absatz = ieslist[2]
    ...
1. Wenn du eine XML-Datei schreiben möchtest, dann mach das besser auch mit passender XML-Verarbeitung und nicht händisch. lxml ist da eine ganz gute Wahl.
2. Der Code enthält Leerzeichen und Tabulatoren wüst durcheinander. Es ist ein Wunder, dass das überhaupt läuft.
3. Das obige schreibt sich schöner wie folgt (PEP-8 habe ich auch noch angewendet), es sei denn, ieslist enthält noch mehr Elemente:

Code: Alles auswählen

for (nr, summe, absatz) in iesdata:
    ...
juju
User
Beiträge: 47
Registriert: Dienstag 25. Mai 2010, 16:02

danke für den hinweis...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

/me hat geschrieben: 1. Wenn du eine XML-Datei schreiben möchtest, dann mach das besser auch mit passender XML-Verarbeitung und nicht händisch. lxml ist da eine ganz gute Wahl.
Sollte er aus diesem Thread doch gelernt haben möchte man meinen...
http://python-forum.de/viewtopic.php?f=1&t=22983
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
juju
User
Beiträge: 47
Registriert: Dienstag 25. Mai 2010, 16:02

Sollte er aus diesem Thread doch gelernt haben möchte man meinen...
http://python-forum.de/viewtopic.php?f=1&t=22983
Wie im Vorfeld schon des öfteren festgestellt wurde, handelt es sich bei dieser Anfrage betreffenden XML um keine standardisierte...weswegen die Arbeit mit einem XML Parser nicht möglich ist...

Trotzdem Danke für diese " konstruktive" Kritik
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

juju hat geschrieben:Wie im Vorfeld schon des öfteren festgestellt wurde, handelt es sich bei dieser Anfrage betreffenden XML um keine standardisierte...weswegen die Arbeit mit einem XML Parser nicht möglich ist...
Ja, aber ... du hast doch selber in einem deiner letzten Postings in diesem Thread gesagt, dass du jetzt XML schreiben möchtest.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

/me hat geschrieben:
juju hat geschrieben:Wie im Vorfeld schon des öfteren festgestellt wurde, handelt es sich bei dieser Anfrage betreffenden XML um keine standardisierte...weswegen die Arbeit mit einem XML Parser nicht möglich ist...
Ja, aber ... du hast doch selber in einem deiner letzten Postings in diesem Thread gesagt, dass du jetzt XML schreiben möchtest.
Und darauf und auf Deinen Hinweis habe ich mich bezogen... manche Leute scheinen Beratungs- / Lernresistent zu sein :roll:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
juju
User
Beiträge: 47
Registriert: Dienstag 25. Mai 2010, 16:02

nein nein...das Programm sollte vom Aufbau identisch sein mit der Quelldatei... dann ist das falsch verstanden und oder nicht richtig von mir dargestellt worden...macht ja nix...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

juju hat geschrieben:nein nein...das Programm sollte vom Aufbau identisch sein mit der Quelldatei... dann ist das falsch verstanden und oder nicht richtig von mir dargestellt worden...macht ja nix...
Also willst Du am Format nichts ändern und kein xml schreiben. Das hattest Du aber unlängst genau so geschrieben; daher kam dann unsere Irritation.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten