参考未声明的实体©

时间:2015-01-29 10:35:15

标签: c# xml xml-parsing xmlreader xml-dtd

当我使用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副本并将其链接到代码中?请帮助我。

1 个答案:

答案 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.