Walidacja DTD zgłasza błędy, choć xml jest prawidłowy

0

Może być trochę mętnie, bo i właśnie nie wiem już co sprawdzać i ogólnie o co kaman.
Przez ostatnie kilka dni męczyłam zupełnie inne błędy, w innym miejscu w kodzie, nie modyfikowałam xmla. Za to zmieniałam wersję .NET Framework czy TargetPlatform.

No i to co działało jeszcze kilka dni temu, teraz już nie działa:

        public static void DTDValidate(XmlDocument xml, string documentName, string publicId, string systemId)
        {
            var oldDoctype = xml.DocumentType;
            if (oldDoctype != null)
            {
                xml.RemoveChild(oldDoctype);
            }

            var doctype = xml.CreateDocumentType(documentName, publicId, systemId, null);
            xml.InsertAfter(doctype, xml.FirstChild);

            var settings = new XmlReaderSettings
            {
                DtdProcessing = DtdProcessing.Parse,
                ValidationType = ValidationType.DTD
            };
            settings.ValidationEventHandler += DTDError;

            var reader = XmlReader.Create(new StringReader(xml.OuterXml), settings);
            while (reader.Read())
            {
            }
        } 

A nie działa w taki sposób, że rzuca błędy, choć nie powinno. Błędy mówią, że każdy jeden element tego xmla jest nieprawidłowy (The 'xxx' element is not declared.).

Gdy ustawię się w debugerze tuż przed czytaniem, skopiuję wartość z OuterXml i wkleję ją do Notepad++ w celu sprawdzenia, czy się waliduje, to waliduje się OK.

Jako że każdy jeden element mu nie pasuje, to mam podejrzenie, że chyba jednak nie wczytał tego DTD. Niestety brakuje mi pomysłów, jak to dalej debugować, co sprawdzić, żeby dojść co jest nie tak... A google w błędach walidacji DTD zwraca niestety głównie sugestie, że jest błąd w xmlu lub dtd ;)

edit:
Po dodatkowych sprawdzeniach - gdy zmieniam wersję frameworka na .NET 4.0, to powyższe działa prawidłowo (czyli nie rzuca błędów).
Natomiast na wersji .NET 4.5.2 rzuca błędy, choć nie powinno.

Czy macie może jakieś propozycje, jak rozwiązać ten problem, biorąc pod uwagę, że muszę skorzystać z wersji min. 4.5.2, bo tylko z taką jest kombatybilna pewna biblioteka, której chciałam użyć...? :D (Sprawdzałam 4.6 i jest jak na 4.5.2).

1

No więc okazało się, że nastąpiła zmiana w .NET - wcześniej XmlResolver był domyślnie ustawiany na XmlUrlResolver. Takie coś znów działa OK:

var settings = new XmlReaderSettings
            {
                DtdProcessing = DtdProcessing.Parse,
                ValidationType = ValidationType.DTD,
                XmlResolver = new XmlUrlResolver()
            };

1 użytkowników online, w tym zalogowanych: 0, gości: 1