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

标签 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 定义,有人可能有任何线索吗?

最佳答案

从微软董事会的某个地方偷来的答案:

此行为是设计使然。当在 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/

相关文章:

c# - Cookie.ExpireTimeSpan 被忽略并在 CookieAuthentication 中设置为 Session

c# - 使用 RX 在不同时间触发事件?

c# - dbcontext 和 objectcontext 中的 NULL 处理

css - 使用 Css 清除 TextBox 文本/值

c# - 以二进制值将字符串格式的十六进制 block 写入注册表

c# - 使用 C# 和 Win API 移动屏幕键盘 (osk.exe)

c# - LINQ自引用表过滤关系

c# - LINQPad,使用多个数据上下文

带换行符的内联元素上的 XHTML/CSS 填充

css - 预定义 HTML 时使用 CSS 更改 div 顺序