当我使用C#处理XML文件时,我收到此错误。我搜索了以前的问题并找到了原因。我知道这些实体不是用XML预定义的,必须包含在DTD中。它包含在DTD中。我的XML文件包括以下DTD。
<!DOCTYPE doc PUBLIC "-//Location//EN"
"NAME.dtd" [
<!ENTITY C-1FHY "SD FFF">
<!ENTITY Ca- "XX">
]>
另外
我需要从这个XML文件中读取内容。我使用了XMLReader。
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Parse;
XmlReader doc = XmlReader.Create(f, settings);
while (doc.Read())
{
如果我忽略DTD,它会抛出错误。如果我解析,那么它说它无法在每个文件所在的位置找到DTD。如果我将DTD复制到文件所在的同一位置,我就没有任何问题。
我的问题是超过60个子文件夹中有500多个文档。我无法在每个文件夹中放置DTD的副本。有没有办法在路径中存储单个DTD副本并将其链接到代码中?请帮助我。
答案 0 :(得分:1)
您可以制作重新映射文件位置的自定义XmlUrlResolver
:
public class XmlUrlOverrideResolver : XmlUrlResolver
{
public Dictionary<string, string> DtdFileMap { get; private set; }
public XmlUrlOverrideResolver()
{
this.DtdFileMap = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
}
public override Uri ResolveUri(Uri baseUri, string relativeUri)
{
string remappedLocation;
if (DtdFileMap.TryGetValue(relativeUri, out remappedLocation))
return new Uri(remappedLocation);
var value = base.ResolveUri(baseUri, relativeUri);
return value;
}
}
然后使用它:
var resolver = new XmlUrlOverrideResolver();
resolver.DtdFileMap[@"NAME.dtd"] = @"C:\Location\Of\File\name.dtd";
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Parse;
settings.XmlResolver = resolver;
// Proceed as before.