2014-03-19 3 views
1

Предположим, мы хотим загрузить 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.

ответ

1

Если вместо того, чтобы читатель является экземпляром устаревшего XmlTextReader:

XmlTextReader textReader = new XmlTextReader(stream, XmlNodeType.Document, context); 
XmlValidatingReader reader = new XmlValidatingReader(textReader); 
reader.ValidationType = ValidationType.DTD; 
reader.ValidationEventHandler += Settings_ValidationEventHandler; 

Тогда не является исключением несколько ОТДА и XML проверяется.

Очевидно, что существует разница между функциями XmlTextReader и XmlReader. Кажется, что оба они выдают предупреждение, когда в xml отсутствует DOCTYPE, который останавливает проверку. Следующие недоразумения связаны с недоразумением XmlValidatingReaderImpl.ProcessCoreReaderEvent() и DtdValidator.Validate() (где schemaInfo.SchemaType == SchemaType.DTD ложно, возможно, потому, что DTD не существует).

Учитывая все это, лучше просто попытаться изменить/добавить элемент DOCTYPE во входном xml, чем сражаться с XmlParserContext и различными реализациями считывателя.

Смежные вопросы