引用未声明的实体&copy

Reference to undeclared entity &copy

当我使用 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 的单个副本存储在路径中并 link 它在代码中?请帮助我。

您可以自定义 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.