Python DOM SVG

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
Higarts
User
Beiträge: 4
Registriert: Sonntag 26. Oktober 2014, 17:30

Hallo zusammen,

ich lerne Python erst seit Beginn dieses Semesters, bin also nicht wirklich fit.
Ich hänge gerade bei einer Aufgabe. Ich habe schon dazu gegoogelt finde aber keine Lösung bzw. sehe die Lösung vll nicht.
Jedenfalls soll ein Python Programm mit DOM erstellt werden, welches ein SVG Dokument (mit ein bisschen Text) als Datei einliest und die Inhalte der Textknoten abändert.
Ich finde allerdings nur Beispiele im Internet bzgl. XML-Dokumenten, die mit DOM dargestellt werden.
In meinem Skripte finde ich auch nur Beispiele mit XML-Dokumenten, wo dann mit der xml.dom.minidom-Bibliothek gearbeitet wird.
Gibt es auch eine svg.dom.minidom? Mir geht es jetzt primär um das einlesen, wie das hier funktioniert. Das mit dem Inhalt abändern will ich selber hinkriegen. :wink:

Habt ihr einen Tipp? :|

PS: Ich wusste jetzt nicht welches Unterforum ich nehmen soll. Danke im voraus fürs richtig einordnen!
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Willkommen im Forum und zu Python!

SVG _ist_ ein XML Format, insofern brauchst du auf dieser Ebene[1] keine speziellen SVG Module. Benutze einfach XML Werkzeuge dafuer.

Wobei ich hier DOM meiden wuerde und `lxml` benutzen wuerde.

[1] Solange es um Textaenderungen und Aehnliches geht. Natuerlich macht es keinen Sinn so Bilder zu erzeugen.
Higarts
User
Beiträge: 4
Registriert: Sonntag 26. Oktober 2014, 17:30

cofi hat geschrieben:Willkommen im Forum und zu Python!

SVG _ist_ ein XML Format, insofern brauchst du auf dieser Ebene[1] keine speziellen SVG Module. Benutze einfach XML Werkzeuge dafuer.

Wobei ich hier DOM meiden wuerde und `lxml` benutzen wuerde.

[1] Solange es um Textaenderungen und Aehnliches geht. Natuerlich macht es keinen Sinn so Bilder zu erzeugen.
DOM ist hier leider vorgeschrieben. :cry:
Die Textänderung ergibt sich daraus, dass das SVG ein Schema mit Kreisen und Pfeilen darstellt und in den Kreisen Text steht.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Higarts: wieder mal ein typischer Fall von "Ich bearbeite schon seit 20 Jahren in Java XML-Dokumente mit DOM, also müssen meine Studenten auch in Python DOM benutzen". Die eindeutig überlegene API hat ElementTree bzw. lxml.
Higarts
User
Beiträge: 4
Registriert: Sonntag 26. Oktober 2014, 17:30

Sirius3 hat geschrieben:@Higarts: wieder mal ein typischer Fall von "Ich bearbeite schon seit 20 Jahren in Java XML-Dokumente mit DOM, also müssen meine Studenten auch in Python DOM benutzen". Die eindeutig überlegene API hat ElementTree bzw. lxml.
Kann sein, der Dozent ist schon älter. :wink:

Aktueller Stand:

Code: Alles auswählen

schema=u"""<svg xmlns="http://www.w3.org/2000/svg" width="480" height="640" viewBox="0 0 480 640">

<defs>

    <filter id="dropShadow" x="0" y="0" width="120%" height="120%">
    <feGaussianBlur in= (...)

(...)
(...)
(...)

</g>

</g>

</svg>""".encode('UTF-8')
Soweit das SVG als String. Hatten wir mit dem XML-Dokument auch so gemacht.

Und dann minidom:

Code: Alles auswählen

#! /usr/bin/python
# -*- coding: utf-8 -*-
from xml.dom.minidom import parse, parseString
from xml.dom import DOMException

class XMLasDOM():
    
    def __init__(self,xmldocument=None,filename=None):
        if xmldocument:
            self.document = parseString(xmldocument)
        elif filename:
            self.document = parse(filename)
        else:
            raise ValueError("kein Argument übergeben")
        self.root = self.document.documentElement

schemaDokument = XMLasDOM(schema)
Soweit so gut, aber dann:

Code: Alles auswählen

root = schema.root
(...)
AttributeError: 'str' object has no attribute 'root' :shock:

Warum denn das? Bei der XML-Datei geht das ja auch? :oops:
Zuletzt geändert von Higarts am Sonntag 26. Oktober 2014, 19:51, insgesamt 2-mal geändert.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Higarts: Für Code gibt es hier im Forum die python-Tags. Damit werden auch Einrückungen korrekt dargestellt.
Was ist der Unterschied zwischen schema und schemaDokument?
Higarts
User
Beiträge: 4
Registriert: Sonntag 26. Oktober 2014, 17:30

Sirius3 hat geschrieben:@Higarts: Für Code gibt es hier im Forum die python-Tags. Damit werden auch Einrückungen korrekt dargestellt.
Was ist der Unterschied zwischen schema und schemaDokument?
Habs abgeändert. :)

Da ist mir auch gleich der Fehler aufgefallen!
Es muss natürlich

Code: Alles auswählen

root = schemaDokument.root
heißen.

Ich arbeite dann mal weiter dran. :o
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Wofür ist eigentlich diese vollkommen unnütze Klasse gut? Alleine der Name deutet schon auf eine Funktion hin. Darüber hinaus nimmst Du in der __init__-Funktion eine Fallunterscheidung anhand der Parameter durch. Beim Aufruf musst Du Dir trotzdem Gedanken machen, welche Parameter Du mitgibst. Ergo: Wieder eine Fallunterscheidung.

Reduzierst Du das weiter, könntest du direkt die Funktionen parse und parseString verwenden.

Hier missbrauchst Du Klassen als Namensraum für eine Funktion; eigentlich zwei Funktionen in einer.

parse erwartet keinen Dateinamen sondern ein Datei-Objekt. Somit wäre die Signatur Deiner __init__-Funktion falsch.

Grüße ... bwbg
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Antworten