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.
Habt ihr einen Tipp?
PS: Ich wusste jetzt nicht welches Unterforum ich nehmen soll. Danke im voraus fürs richtig einordnen!
Python DOM SVG
- 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.
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.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
DOM ist hier leider vorgeschrieben.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.
Die Textänderung ergibt sich daraus, dass das SVG ein Schema mit Kreisen und Pfeilen darstellt und in den Kreisen Text steht.
@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.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.
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')
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)
Code: Alles auswählen
root = schema.root
(...)
Warum denn das? Bei der XML-Datei geht das ja auch?
Zuletzt geändert von Higarts am Sonntag 26. Oktober 2014, 19:51, insgesamt 2-mal geändert.
Habs abgeändert.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?
Da ist mir auch gleich der Fehler aufgefallen!
Es muss natürlich
Code: Alles auswählen
root = schemaDokument.root
Ich arbeite dann mal weiter dran.
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
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!"