gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 01:49:53 29 4
gpt4 key购买 nike

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

我可以成功忽略 .dtd 文件中进行的验证,但 .dtd 文件必须存在于我的本地硬盘上。我想删除这些过时的文件,但没有找到方法。

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

<?xml version="1.0" encoding="us-ascii" standalone="no"?>
<!DOCTYPE SomeMessage SYSTEM "SomeMessage.dtd">
<SomeMessage>data</SomeMessage>

我用来打开文档的函数:

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!
}

捕获到的异常:

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”必须存在,否则会抛出异常。

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

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

最佳答案

解决方案是将底层 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
}

关于c# - 忽略 DOCTYPE .dtd,但 .dtd 文件必须仍然存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3894317/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com