XmlDocumentType ohne Laden der systemId

26/02/2010 - 13:23 von Christian Thiele | Report spam
Hi,

noch eine kleine Frage zu meinem SVG-Ersteller. Der funktioniert tadellos,
sollte aber, damit es ein korrektes SVG wird, den entsprechenden Doctype
enthalten. Das ist in C# auch schnell gemacht:

XmlDocumentType xdt = xmlDoc.CreateDocumentType("svg", "-//W3C//DTD SVG
1.1//EN", "http://www.w3.org/Graphics/SVG/1.1/...dtd", null);
xmlDoc.AppendChild(xdt);

Nun hat der XmlDocumentType-Constructor aber die Angewohnheit, nicht nur
die entsprechende Zeile in das SVG einzufügen (bzw. im Xml-Baum
entsprechend repràsentiert einzufügen), sondern auch die DTD von w3.org zu
laden. Das ist ja ganz schön, wenn ich bei irgendeinem Xml-Zusammensetzen
die DTD prüfen will. Wenn ich aber ein SVG erstelle, verzögert diese Zeile
den Programmablauf um Sekunden. Ich kann natürlich die Zeile

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/...">

manuell in den String einfügen, nachdem ich mit dem XML-Zusammensetzen
fertig bin, aber das ist recht unschön. Gibt es eine Möglichkeit, ein
DocumentType in ein Xml-Dokument einzufügen, OHNE dass .NET den DTD làdt
(und prüft?). Ich habe mich ein wenig durch den .NET-Code gedebuggt, aber
an keiner Stelle ein entscheidendes if gefunden.

Danke im Voraus,
Christian Thiele
 

Lesen sie die antworten

#1 Martin Honnen
26/02/2010 - 14:07 | Warnen spam
Christian Thiele wrote:

XmlDocumentType xdt = xmlDoc.CreateDocumentType("svg", "-//W3C//DTD
SVG 1.1//EN", "http://www.w3.org/Graphics/SVG/1.1/...dtd", null);
xmlDoc.AppendChild(xdt);

Nun hat der XmlDocumentType-Constructor aber die Angewohnheit, nicht nur
die entsprechende Zeile in das SVG einzufügen (bzw. im Xml-Baum
entsprechend repràsentiert einzufügen), sondern auch die DTD von w3.org
zu laden. Das ist ja ganz schön, wenn ich bei irgendeinem
Xml-Zusammensetzen die DTD prüfen will. Wenn ich aber ein SVG erstelle,
verzögert diese Zeile den Programmablauf um Sekunden. Ich kann natürlich
die Zeile

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/...">

manuell in den String einfügen, nachdem ich mit dem XML-Zusammensetzen
fertig bin, aber das ist recht unschön. Gibt es eine Möglichkeit, ein
DocumentType in ein Xml-Dokument einzufügen, OHNE dass .NET den DTD làdt
(und prüft?). Ich habe mich ein wenig durch den .NET-Code gedebuggt,
aber an keiner Stelle ein entscheidendes if gefunden.



Setze den XmlResolver auf null:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.XmlResolver = null;
XmlDocumentType xdt = xmlDoc.CreateDocumentType("svg",
"-//W3C//DTD SVG 1.1//EN",
"http://www.w3.org/Graphics/SVG/1.1/...dtd", null);
xmlDoc.AppendChild(xdt);

dann wird keine Anfrage gemacht. Oder implementiere halt einen
XmlResolver, der die DTD aus einem lokalen Cache làdt, und weise diesen
Resolver zu. Das làsst sich mit relativ wenig Aufwand erreichen, indem
man von XmlUrlResolver ableitet.


Martin Honnen MVP XML
http://msmvps.com/blogs/martin_honnen/

Ähnliche fragen