gpt4 book ai didi

c# - 在 C# 中使用本地 DTD 文件验证 XML 文件时出现问题

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

我正在尝试验证 XML 文件。我正在使用这段代码

XmlReaderSettings settings = new XmlReaderSettings();
settings.ProhibitDtd = false;
settings.ValidationType = ValidationType.DTD;

settings.ValidationEventHandler += new ValidationEventHandler(validationError);

XmlSchemaSet schemas = new XmlSchemaSet();
settings.Schemas = schemas;
XmlReader reader = XmlReader.Create(lblXmlPath.Text, settings);

reader.Settings.Schemas.Add(null, lblDTDPath.Text);
while (reader.Read())
{
// empty by now
}
reader.Close();

但在行“reader.Settings.Schemas.Add(null, lblDTDPath.Text);” Visual Studio 向我显示错误“出于安全原因,此 XML 文档中禁止 DTD。要启用 DTD 处理,请将 XmlReaderSettings 上的 ProhibitDtd 属性设置为 false,并将设置传递给 XmlReader.Create 方法”

如您在代码中所见,ProhibitDtd 设置为 false(我也在调试期间进行了验证)。我还尝试在调用 XmlReader.Create() 之前添加架构,但没有成功。

最佳答案

我之前为了验证 RSS 提要而这样做过。通过本地存储的 DTD 进行验证的方法是将自定义 XmlResolver 插入到 XmlReader

XmlReaderSettings readerSettings = new XmlReaderSettings();
readerSettings.ValidationType = ValidationType.DTD;
readerSettings.ProhibitDtd = false;
readerSettings.XmlResolver = new XmlFakeDtdResolver();

这将为读者提供本地 DTD(对于已知格式),而不是从 DOCTYPE 中给出的 URL 下载它。

class XmlFakeDtdResolver : XmlUrlResolver
{
public static Dictionary<Uri, byte[]> dtdMap = new Dictionary<Uri, byte[]>();
public static Dictionary<string, Uri> uriMap = new Dictionary<string, Uri>();
static XmlFakeDtdResolver()
{
Uri rss091uri = new Uri("http://fake.uri/rss091");
uriMap["-//Netscape Communications//DTD RSS 0.91//EN"] = rss091uri;
uriMap["http://my.netscape.com/publish/formats/rss-0.91.dtd"] = rss091uri;
dtdMap[rss091uri] = Encoding.ASCII.GetBytes(Resources.rss_0_91dtd);
}

public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
{
if (dtdMap.ContainsKey(absoluteUri) && ofObjectToReturn == typeof(Stream))
{
return new MemoryStream(dtdMap[absoluteUri]);
}
return base.GetEntity(absoluteUri, role, ofObjectToReturn);
}

public override Uri ResolveUri(Uri baseUri, string relativeUri)
{
if (uriMap.ContainsKey(relativeUri))
return uriMap[relativeUri];
return base.ResolveUri(baseUri, relativeUri);
}
}

最后,我决定不使用 DTD 验证,而是通过 XML 模式进行验证,原因之一是许多提要不包含 DOCTYPE

关于c# - 在 C# 中使用本地 DTD 文件验证 XML 文件时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1508799/

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