我正在尝试将 XHTML 文件加载到 LINQ XElement 中。但是,我在解析器方面遇到了问题。该问题与以下定义有关:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
我有一个自定义的 XmlUrlResolver ,其中包含一个重写的 GetEntity ,它可以转换链接,例如 http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd到本地资源流。这几乎适用于整个 XHTML DTD。我唯一无法真正解决的是 Uri“-//W3C//DTD XHTML 1.0 Transitional//EN”,我不确定应该用它做什么。
public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
{
var resourceName = "ePub.DTD." + absoluteUri.Segments[absoluteUri.Segments.GetLength(0) - 1];
if (_resources.Contains(resourceName))
{
Stream dataStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName);
return dataStream;
}
return base.GetEntity(absoluteUri, role, ofObjectToReturn);
}
正如您在上面的代码中看到的,我无法解析的任何内容都由默认的 XmlUrlResolver
处理。这意味着上面的链接以 -//W3C/开头。然而,基本方法会抛出一个DirectoryNotFoundException
。继续将加载 XElement
就可以了。如果我返回一个空流,则会导致在将 XHTML 加载到 XElement
期间抛出错误。
关于使用自定义 XmlUrlResolver
处理此类 PUBLIC 定义,有人可能有任何线索吗?
最佳答案
从微软董事会的某个地方偷来的答案:
此行为是设计使然。当在 DOCTYPE 声明中同时指定公共(public) ID 和系统 ID 时,XmlReader 首先尝试 XmlResolver.GetEntity 是否理解公共(public)标识符(“-//W3C//DTD XHTML 1.1//EN”)。因此,它使用公共(public) ID 调用 GetEntity,如果解析器不理解它(如 XmlUrlResolver),则会引发异常。 XmlReader 捕获异常并调用 GetEntity,但这次使用系统标识符 (“http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd”)。
谢谢, -Helena Kotas,System.Xml 开发人员
Gepost 门 Microsoft op 10-5-2006 om 17:34
关于c# - 如何使用自定义 XmlUrlResolver 将 XHTML 文件加载到 XElement 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2210619/