我有一个处理HTTP请求的Web服务.它接收的文档具有嵌入的DOCTYPE,用于指定.dtd文件.我希望使用更新的XML架构验证文件,以便在较新的设备连接到我的服务时制作.
我可以成功忽略.dtd文件中的验证,但.dtd文件必须存在于我的本地硬盘驱动器上.我想删除这些过时的文件,并没有找到办法.
我正在处理的示例XML文档:
<?xml version="1.0" encoding="us-ascii" standalone="no"?>
<!DOCTYPE SomeMessage SYSTEM "SomeMessage.dtd">
<SomeMessage>data</SomeMessage>
Run Code Online (Sandbox Code Playgroud)
我用来打开文档的功能:
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!
}
Run Code Online (Sandbox Code Playgroud)
捕获的异常:
System.IO.FileNotFoundException: Could not find file 'c:\windows\system32\inetsrv\SomeMessage.dtd'. File name: 'c:\windows\system32\inetsrv\SomeMessage.dtd' at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
没有使用SomeMessage.dtd文件的内容 - 它根据我的意愿被忽略.但是,必须存在虚拟文件"c:\ windows\system32\inetsrv\SomeMessage.dtd",否则抛出异常.
我使用Visual Studio 2010和.Net 4.0在Windows 7上运行
如何忽略embeded .dtd并且还不需要在我的计算机上安装虚拟.dtd文件?
aaa*_*bbb 10
解决方案是将底层XmlTextReader的XmlResolver设置为null.更改XmlReaderSettings.XmlResolver = null没有帮助,也没有设置XmlDocument.XmlResolver = null
这是更正后的功能:
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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8767 次 |
| 最近记录: |