Hallo,
ich benutze OpenXML um eine SVG Datei zu parsen. Der Parser legt beim Validieren eine Liste an, über die man mittels der Funktion GetElementById(IdString) auf jedes Element im DOM zugreifen kann. Das tut er aber nur, wenn über eine DTD ein Attribut von Typ ID definiert wird, da er dann auch die Referenzen darauf überprüft. Tritt ein Fehler beim Validieren auf, wird die Liste gelöscht, ansonsten steht sie danach zur weiteren Verfügung. Ich habe die offizielle DTD von W3C angegeben: http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd
Diese DTD ist die Modulare DTD, so dass sie aus vielen einzelen Teilen besteht, ein/der Validator ist da "genötigt" gegebenfalls die Teile aus dem Internet zu laden. Du dir kannst als Alternative die "flache" Version der DTD herunterladen http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-flat.dtd, die du dann auch lokal auf deinem Rechner verwenden kannst.
Leider bestehen meine, mit den Open Source Programm Inkscape erzeugten, SVG-Dateien die Validierung nicht. Ich vermute es liegt am Parser,
Nein, es liegt an der Datei bzw. am Inkscape, weil dieser sehr viele zusätzliche Elemente und Attribute und ihre Namensräume in das Dokument einfügt, die aber alle nicht in der DTD deklariert sind. (Inkscape verwendet von Haus aus keine DTD für die SVG-Dateien, wohl deshalb.)
Den eigentlichen Fehler zu finden sehe ich keine Chance
Wenn du alle Elmente und Attribute aus der Datei entfernst, die nicht zu SVG gehören sollte die Datei validieren. (Nur dann kannst du später nicht alles in der Datei machen, was du sonst mit/in Inkscape in der Datei machen konntest, da so die interne Einstellungen für Inkscape natürlich verloren gehen.)
und ich will ja eigentlich nicht validieren, sondern den Parser nur sagen, das jedes Element ein Attribut mit den Namen id vom Typ ID hat,
Das ist bereits der Fall. In der DTD ist die ID-Attribute für jedes SVG-Element als optionales Attribut erlaubt.
Meine Idee ist es deshalb, eine sehr einfache DTD mitzugeben die nur das id Attribut definiert. Ich habe hier schon etwas dazu gefunden:
http://aktuell.de.selfhtml.org/artikel/xml/gruppierung1/
Ich bin ein totaler Anfänger in Sachen DTD und verstehe das Ganze wohl nicht richtig. Alle meine Versuche sind bisher gescheitert. Der Validator hat immer etwas zu meckern. Z.B.:<!DOCTYPE svg [
<!ELEMENT svg ANY>
<!ATTLIST svg id ID #REQUIRED>
]>Hier kommt der Fehler, dass es undefinierte Attribute gibt. Wie definiere ich aber, das es außer id noch beliebig andere Attribute geben kann? Oder anderst gefragt: Wie definiere ich ausschließlich das id Attribut und lasse alles ander offen?
Das geht nicht.
Du müsstest es so schreiben:
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
<!ATTLIST »Element-Name« id ID #IMPLIED>
]>
Du müsstest für jedes Element dann ein Attlist anlegen, wobei »Element-Name« der Name des jeweiligen Elements ist.
Versuche die Sache mit der "flachen" DTD erst, wie gesagt, in der DTD (in allen) ist 2id" als Attribut definiert.
Grüße
Thomas