Предположим, мы хотим загрузить xml (cXML) и проверить его на DTD, который мы сохранили локально. Вот код для этого:XmlReader выдает несколько ошибок DTD
XmlPreloadedResolver resolver = new XmlPreloadedResolver(XmlKnownDtds.None);
resolver.Add(new Uri(DocTypeSystemId), File.ReadAllText(@"C:\cXml.dtd"));
XmlReaderSettings settings = new XmlReaderSettings
{
ValidationType = ValidationType.DTD,
DtdProcessing = DtdProcessing.Parse
};
settings.ValidationEventHandler += Settings_ValidationEventHandler;
XmlParserContext context = new XmlParserContext(null, null, "cXML", null,
DocTypeSystemId, null, null, null, XmlSpace.None);
XmlReader reader = XmlReader.Create(stream, settings, context);
XDocument doc = XDocument.Load(reader);
К сожалению, в случае ввода CXML уже поставляется с определением DTD, то XmlReader выбросит XmlException заявив: Message Cannot have multiple DTDs. Line 2, position 1.
Если удалить DOCTYPE от входа предупреждение показано No DTD found.
, а xml не проверяется.
Кажется, что XmlReader с трудом использует XmlParserContext.