1

为什么当我将 xml 文件加载到 XmlDocument中时,我重载的 XmlResolver 中的 GetEntity 函数被传递了正式公共标识符?这是一个错误还是我应该如何处理?

编辑:这是一些代码。

例如说我这样做:

XmlDocument myXmlDoc = new XmlDocument();
myXmlDoc.XmlResolver = new MyXmlResolver();
myXmlDoc.Load("myxmlfile.xml");

MyXmlResolver我有以下代码:

public override object GetEntity(Uri absUri, string role, Type typeToRet)
{
  if (typeToRet == null || typeToRet == typeof(Stream))
     return GetStream(absUri);
  else
     throw new XmlException("Unsupported class type: " + typeToRet);
}

我通过了“ file://path/to/xmldoc/-//W3C//DTD XHTML 1.1//EN”,absUri这对我来说没有任何意义。我只是应该忽略它吗?

4

3 回答 3

0

你真的需要定制XmlResolver吗?你在你的解析器中做了什么来保证自定义实现?

向您传递这样的 URI 的原因是因为您已告知XmlDocument您将显式解析文档中的所有外部引用(如 DTD)。如果您不需要手动执行此操作,那么您应该使用现有XmlResolver类型或保留它null并让默认行为发生。

于 2009-01-23T14:30:29.657 回答
0

我正在使用一个本地缓存 dtd、mod 文件等(请参阅此问题)。我的问题在于它传递给我的 FPI 并不是真正的外部参考,我无法将它与真正的外部参考区分开来。

于 2009-01-23T14:34:55.793 回答
0

我有同样的问题。我所做的是检查传入的值,如果它是一个错误的值,我将它返回一个有效的 uri,用于我创建的虚拟 DTD。当正确的 dtd 在文档旁边时,只需调用 LoadXML 即可。它知道如何只查看 DTD 并忽略正在破坏 GetEntity 方法的 PUBLIC 部分。我希望将 DTD 放在本地公共位置,这样我就不需要让它与不同地方的文档一起使用。因此,我覆盖 GetEntity,为其提供公共路径,然后我可以将一个 DTD 用于遍布整个文件系统的许多文档。

于 2009-10-01T03:53:45.567 回答