引用未声明的实体©
Reference to undeclared entity ©
当我使用 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.
当我使用 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.