Laden...

[erledigt]DTD wird ab .NET Framework 4.5.2 ignoriert

Erstellt von Michael Hößel vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.043 Views
M
Michael Hößel Themenstarter:in
46 Beiträge seit 2006
vor 5 Jahren
[erledigt]DTD wird ab .NET Framework 4.5.2 ignoriert

verwendetes Datenbanksystem: MS SQL (hierfür nicht relevant)

Ich erstelle seit 2012 BMEcat-Dateien und parse diese im Anschluss gegen eine DTD.
Mit der Umstellung auf das .NET Framework 4.7.1 wird plötzlich die DTD ignoriert. Mit
der .NET Framework Version 4.5.1 funktioniert es noch. Bei allen Versionen ab 4.5.2
kommen dann die Fehler.

Lasse ich den Parser mit folgendem SourceCode:

 
            XmlReaderSettings rdrSet = new XmlReaderSettings();
            rdrSet.DtdProcessing = DtdProcessing.Parse;
            rdrSet.ValidationType = ValidationType.DTD;
            rdrSet.ValidationEventHandler += new ValidationEventHandler(rdrSet_ValidationEventHandler);

            XmlReader xr = XmlReader.Create(texbCatalogFile.Text, rdrSet);
            try
            {
                cancel = false;
                while ((xr.Read()) & (!cancel)) {}
            }
            catch (XmlException xe)
            {
                parseError = true;
                admCtl.showError(xe.Message,
                    "XML-Datei validieren");
            }
            if (parseError)
            {
                admLog.writeLog(AdminLog.LogMask.Data, "Beendet mit Fehlern!");
                admCtl.showError("Die erstellte Datei darf nicht versendet werden!",
                    "Die Datei hat die Prüfung nicht bestanden!");
            }
            else
            {
                admLog.writeLog(AdminLog.LogMask.Data, "Fehlerlos und versandfertig!");
                admCtl.showError("Die erstellte Datei kann versendet werden!",
                    "Die Datei hat die Prüfung bestanden!");
            }
            if (xr != null)
                xr.Close();

auf folgende Datei los


<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE buecher SYSTEM "buecher.dtd">
<buecher>

<buch isbn="nr_3-90193-3949-7" titel="Anbaggern leicht gemacht" autor="Dr. Howtodo">
Ein Anleitung zwischen Genie und Wahnsinn.
</buch>

<buch isbn="nr_3-90193-3950-2" titel="Anbaggern leicht gemacht II" autor="Dr. Howtodo">
Eine weitere Anleitung zwischen Genie und Wahnsinn.
</buch>

</buecher>

wird keine Exception geworfen, aber es werden Validierungsfehler wie
"Das buecher-Element wurde nicht deklariert." erzeugt.

Ich kann den Eintrag für die DTD in "file:buecher.dtd" ändern und das Verhalten ist absolut identisch. Ich kann auch einen ungültigen Dateinamen vorgeben und es ändert sich nichts. Mit dem .NET Framework 4.0 läuft es jedoch auch. Funktioniert die Validierung, wird bei einem falsch Dateinamen, wie erwartet, eine Exception geworfen.

Zur Vollständigkeit hier noch die DTD:


<!ELEMENT buecher (buch)*>
<!ELEMENT buch (#PCDATA)>
<!ATTLIST buch
   isbn     ID    #REQUIRED
   titel    CDATA #REQUIRED
   autor    CDATA #REQUIRED
>

Und wirst du älter als ´ne Kuh,
musst doch lernen immerzu.

16.842 Beiträge seit 2008
vor 5 Jahren

So wie ich das sehe, fehlt Dir einfach nur der Resolver.


XmlReaderSettings rdrSet = new XmlReaderSettings();
rdrSet.XmlResolver = new XmlUrlResolver(); // Resolver
rdrSet.DtdProcessing = DtdProcessing.Parse;

PS: bitte die originale, vollständige Exception posten. Wir können leider nicht hellsehen 😉
[Hinweis] Wie poste ich richtig? Punkt 5

M
Michael Hößel Themenstarter:in
46 Beiträge seit 2006
vor 5 Jahren

hallo Abt,

vielen Dank für die Mühe. Dadurch, das pro node nur ein Validierungsfehler
und keine Exception kommt hatte ich keinen Ansatz und habe die letzten beiden
Jahre mit 4.0 gearbeitet.
Ich habe die Zeile eingefügt und es funktioniert wie erwartet.
Danke. 👍 😁

Und wirst du älter als ´ne Kuh,
musst doch lernen immerzu.