如何使用自定义XmlUrlResolver将XHTML文件加载到XElement中?

时间:2010-02-05 21:36:40

标签: c# linq xhtml linq-to-xml dtd

我试图将一个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定义的任何线索吗?

1 个答案:

答案 0 :(得分:3)

在某个地方从Microsoft主板上窃取的答案:

此行为是设计使然。如果在DOCTYPE声明中指定了公共ID和系统ID,则XmlReader首先尝试XmlResolver.GetEntity是否了解公共标识符(“ - // W3C // DTD XHTML 1.1 // EN”)。因此它使用公共ID调用GetEntity,如果解析器不理解它(如XmlUrlResolver),则会抛出异常。 XmlReader捕获异常并调用GetEntity,但这次使用系统标识符(“http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd”)。

谢谢, -Helena Kotas,System.Xml开发人员

Gepost door Microsoft op 10-5-2006 om 17:34