К сожалению, библиотека, сгенерировавшая XML, использовала относительный URL для dtd, а не полностью определенный. Таким образом, XmlDocument XmlControl использует класс XmlResolver для преобразования относительного пути в полностью определенный. По умолчанию используется XmlUrlResolver (это конкретный XmlResolver). Это попытается сопоставить местоположение dtd с местоположением, которое, по его мнению, относится к документу Xml. Проблема в том, где XmlDocument? Вероятно, в памяти, которая не относится ни к чему, и XmlUrlResolver использует вместо этого местоположение процесса, которое в вашем случае является Visual Studio, расположенным в «c: \ Program Files \ Microsoft Visual Studio 9.0 \ Common7 \ IDE \ devenv.exe».
Так что вы можете сделать? Ну, я полагаю, вы должны создать свой собственный XmlResolver, который наследует от XmlUrlResolver, переопределяет метод ResolveUri и делает что-то подходящее. Сделав это, вы должны будете:
- Создайте класс XmlReaderSettings и установите для свойства XmlReolver класс, который вы только что создали.
- Создайте XmlReader, используя XmlReader.Create (), передавая ваш документ и объект XmlSettings.
- Создайте XmlDocument и вызовите метод Load, передавая его в XmlReader и, наконец,
- Установите для свойства XmlDocument вашего XmlControl значение XmlDocument.
Честно говоря, все это немного болезненно, так что если бы это было так, я бы просто использовал string.Replace, чтобы удалить объявление DTD из документа перед его обработкой в XML.
Если вы чувствуете себя действительно смелым, вы можете создать распознаватель, который наследуется непосредственно от XmlResolver. Сделав это, вы можете переопределить метод GetEntity , а затем вы можете получить документ dtd из любого места. Я однажды написал, что получил dtds из файлов, встроенных в файлы ресурсов, но, к сожалению, у меня больше нет кода: - (