忽略DOCTYPE .dtd,但.dtd文件必须仍然存在

我有一个处理HTTP请求的Web服务。 它接收的文档有一个嵌入的DOCTYPE,它指定.dtd文件。 我希望使用更新的XML架构validation文件,以便在较新的设备连接到我的服务时使用。

我可以成功忽略.dtd文件中的validation,但.dtd文件必须存在于我的本地硬盘驱动器上。 我想删除这些过时的文件,并没有找到办法。

我正在处理的示例XML文档:

  data 

我用来打开文档的function:

 private void LoadXmlDoc(XmlTextReader myXmlTextReader) { XmlReaderSettings readerSettings = new XmlReaderSettings(); readerSettings.ValidationType = ValidationType.Schema; readerSettings.Schemas.Add(null, MyGoodSchemaFile); readerSettings.DtdProcessing = DtdProcessing.Ignore; readerSettings.XmlResolver = null; // Added as a test. readerSettings.ValidationEventHandler += ValidationEventHandle; XmlReader myXmlReader = XmlReader.Create(myXmlTextReader, readerSettings); XmlDocument myXmlDocument = new XmlDocument(); myXmlDocument.XmlResolver = null; // Added as a test. myXmlDocument.Load(myXmlReader); // Exception thrown here! } 

捕获的exception:

 System.IO.FileNotFoundException:找不到文件'c:\ windows \ system32 \ inetsrv \ SomeMessage.dtd'。
文件名:'c:\ windows \ system32 \ inetsrv \ SomeMessage.dtd'
   在System.IO .__ Error.WinIOError(Int32 errorCode,String maybeFullPath)

没有使用SomeMessage.dtd文件的内容 – 它会被我忽略。 但是,必须存在虚拟文件“c:\ windows \ system32 \ inetsrv \ SomeMessage.dtd”,否则抛出exception。

我使用Visual Studio 2010和.Net 4.0在Windows 7上运行

如何忽略embeded .dtd并且还不需要在我的计算机上安装虚拟.dtd文件?

解决方案是将底层XmlTextReader的XmlResolver设置为null。 更改XmlReaderSettings.XmlResolver = null没有帮助,也没有设置XmlDocument.XmlResolver = null

这是更正后的function:

 private void LoadXmlDoc(XmlTextReader myXmlTextReader) { // The next line is the fix!!! myXmlTextReader.XmlResolver = null; // Don't require file in system32\inetsrv XmlReaderSettings readerSettings = new XmlReaderSettings(); readerSettings.ValidationType = ValidationType.Schema; readerSettings.Schemas.Add(null, MyGoodSchemaFile); readerSettings.DtdProcessing = DtdProcessing.Ignore; readerSettings.XmlResolver = null; // Doesn't help readerSettings.ValidationEventHandler += ValidationEventHandle; XmlReader myXmlReader = XmlReader.Create(myXmlTextReader, readerSettings); XmlDocument myXmlDocument = new XmlDocument(); myXmlDocument.XmlResolver = null; // Doesn't help myXmlDocument.Load(myXmlReader); // Load doc, no .dtd required on local disk }