| 

.NET C# Java Javascript Exception

3
Hallo zusammen,

ich möchte ein XML Dokument laden. Dabei möchte ich im Code die DOCTYPE ENTITIES angeben können.

Wenn ich folgende Datei mit XDocument.Load lade:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE Method [
<!ENTITY var1 "Hello world">
<!ENTITY var2 "Codekicker.de">
]>
<Method>
<Ausgabe>&var1; auf &var2;</Ausgabe>
</Method>


macht der Parser dann folgendes daraus:

<!DOCTYPE Method [
<!ENTITY var1 "Hello world">
<!ENTITY var2 "Codekicker.de">
]>
<Method>
<Ausgabe>Hello world auf Codekicker.de</Ausgabe>
</Method>


Wie kann ich im Code var1 und var2 vor dem .Load() definieren, damit so etwas auch dynamisch funktioniert?

Nachtrag:
Oder kann ich den Load ausführen, ohne die Entities aufzulösen (und ohne eine Exception zu erhalten). Dann könnte man mit diesem XDocument und zusätzlich XDocument.DocumentType ein neues XDocument erstellen?

Danke,
Mike
29.09.2011
Xantiva 2,3k 2 9
Xantiva 2,3k 2 9
1 Antwort
1
Hallo Xantiva,

ich habe etwas recherchiert und soweit ich das verstanden habe, geht das mit einem XDocument nicht. Auf Codeproject habe ich eine hervorragende Übersicht gefunden: Common Pitfalls in System.Xml 4.0.
Irgendwo hab ich gelesen, dass Du das Dokument ohne Auflösung der Entities mit dem DOM, laso XmlDocuemnt laden kannst (weiß nicht, ob das eine Option ist). Der CodeProject Artikel warnt auch explizit vor der Verwendung von DTDs und Entities, hab nicht genauer gelesen warum, aber ich denke der Artikel hilft Dir weiter.
Würde nicht auch ein z.B. XSLT helfen, die von Dir geforderte Dynamik zu erreichen? Validierung mit XSD?

Viel Erfolg
Florian
30.09.2011
ffordermaier 8,4k 3 9
Hallo Florian, danke für den Link zu den "Pitfalls". Mit den Infos habe auch noch weiter gesucht, bin aber nicht fündig geworden. XSLT scheint mir auch "oversized". Vielleicht hat ja noch mal jemand eine Idee. Ich bau jetzt erst mal einen Workaround, dass ich weiterkomme und setz ein "fettes" // TODO: dahin ...
Xantiva 30.09.2011
Vielleicht auch nicht optimal, aber wie wäre es, wenn Du die <!ENTITY var1 "Hello world"> vor dem Einlesen (und der damit verbundenen Expansion) per Regex-Replace in memory (als string) verarbeitest?
Danach lädst Du das XDocument, das Dir die Entities zu den Werten expandiert, die Du vorher per Regex eingebracht hast?!?
ffordermaier 30.09.2011

Stelle deine .net-Frage jetzt!