HalloLeute, kann mir jmd helfen (zwecks Python Parsing)?

...komplette Frage anzeigen Element.tree-Bibliothek - (Python, XML, DOM-Bibliothek) Dom-Bibliothek - (Python, XML, DOM-Bibliothek)

2 Antworten

Du bleibst ja hartnäckig am Ball — gefällt mir!

Ich verstehe die Doku (https://docs.python.org/3/library/xml.dom.minidom.html#minidom-and-the-dom-standard) so:

for style in styles:
    Color = style.fillColor
style.fillColor = '255'

/!\ Bei Dir steht "for styles in styles:" — das geht schief!

Aber bevor Du Dich wieder in Details verlierst, solltest erst mal Du die unveränderten Daten zurück schreiben und prüfen, ob die neue Datei akzeptiert wird.

Möglicherweise liegt es gar nicht an den Namespaces, sondern an falschen Farbwerten? Hast Du mal geprüft, einige Farben von Hand zu ändern?

KratzAb 07.08.2017, 13:40

Also ich habe die Namespaces von Hand geändet um zu sehen ob es daran liegt und ich kann bestätigen, dass es danach geklappt hat. Das heißt diese Namespaces sind die "Übeltäter". Weißt du zufällig wie man die umgehen kann?

1
ralphdieter 07.08.2017, 15:12
@KratzAb

Nicht "zufällig", aber jetzt wollte ich es doch genau wissen. Für ElementTree (Dein erster Versuch) habe ich folgendes gefunden:

Beim Parsen werden alle Namespaces durch die URI ersetzt. Aus "xmi:id" wird also "{http://...}id". Beim Schreiben werden diese URIs wieder durch Namespaces ns0, ns1, ... ersetzt: "ns0:id". Das ist blöd, wenn sich ein Programm auf bestimmte Namen verlässt.

Die folgenden Funktionen parse_xmlns(et,...) und write_xmlns(et,...) ersetzen die Methoden et.parse() und et.write():

http://effbot.org/zone/element-namespaces.htm#preserving-existing-namespace-attributes

Beachte, dass diese Funktionen weitere Funktionen aufrufen, die im Text weiter oben stehen. Aber falls dieser Code funktioniert, ist es vermutlich die einfachste Art, das Problem ein für alle Mal zu erschlagen.

1
KratzAb 08.08.2017, 12:31
@ralphdieter

Danke für deine Neugier, ich habe das Problem auch schon gelöst. Danke trotzdem :D Ich habe ein Register mit den Namespaces angelegt und das hat alle meine Probleme beseitigt .

ET.register_namespace('xmi', 'http://www.omg.org/XMI')
ET.register_namespace('sgraph', 'http://www.yakindu.org/sct/sgraph/2.0.0')
ET.register_namespace('notation', 'http://www.eclipse.org/gmf/runtime/1.0.2/notation')
ET.register_namespace('xsi', 'http://www.w3.org/2001/XMLSchema-instance')
1
ralphdieter 08.08.2017, 13:02
@KratzAb

Gratuliere!

register_namespace() wird in meinem Link anfangs auch erwähnt. Ich dachte schon, das wäre die Lösung; allerdings behauptet der Autor, dass diese Information von write() nicht verwendet wird. Deshalb habe ich den Artikel bis zum Ende durchgelesen.

Gut zu wissen, dass es auch einfacher geht. Danke für die Rückmeldung!

0

Ich mach noch nicht sehr lange mit Python rum aber ich würde die xml Zeilenweise einlesen, dann darin nach dem string fillcolor suchen und wenn gefunden halt zerlegen und ersetzen.

so nen parser selber zu schreiben dürfte jetzt nich allzu schwer sein.

Was möchtest Du wissen?