当我将xml文件加载到XmlDocument中时,为什么我的重载XmlResolver中的GetEntity函数被传递Formal Public Identifier?这是一个错误还是我应该处理这个问题?
编辑:以下是一些代码。
比如说我这样做:
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
”,这对我没有任何意义。我只是应该忽略它吗?
答案 0 :(得分:0)
您真的需要自定义XmlResolver
吗?你在解析器中做了什么保证自定义实现?
您传递类似URI的原因是因为您告诉XmlDocument
您将明确解析文档中的所有外部引用(如DTD)。如果您不需要手动执行此操作,则应使用现有的XmlResolver
类型或保留null
并保留默认行为。
答案 1 :(得分:0)
我正在使用一个本地缓存dtd,mod文件等(参见this question)。我做它做的事情的问题在于它传递给我的FPI实际上不是外部参考,我无法将它与真正的外部参考区分开。
答案 2 :(得分:0)
我遇到了同样的问题。我做的是检查传入的值,如果它是一个错误的值,我返回它为我创建的虚拟DTD的有效uri。当正确的dtd在doc旁边时,只需调用LoadXML即可。它知道如何只查看DTD并忽略正在炸毁GetEntity方法的PUBLIC部分。我想在当地的公共场所使用DTD,这样我就不需要在各个地方使用文档。因此,我重写GetEntity,给它提供公共路径,然后我可以将一个DTD用于遍布文件系统的许多文档。