XHTML 1.1验证错误:"Parameter entity 'itself"引用

本文关键字:quot itself 引用 entity Parameter 验证 XHTML 错误 | 更新日期: 2023-09-27 18:17:44

嘿,我尝试用官方dtd验证我的html页面:

MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(MessageBody));
ms.Position = 0;
XmlReaderSettings settingsReader = new XmlReaderSettings();
settingsReader.DtdProcessing = DtdProcessing.Parse;
settingsReader.ValidationType = ValidationType.DTD;
MyUrlResolver resolver = new MyUrlResolver();
settingsReader.XmlResolver = resolver;
 XmlReader reader = XmlReader.Create(ms, settingsReader);
 while(reader.Read()){}

和自定义XmlUrlResolver:

class MyUrlResolver : System.Xml.XmlUrlResolver
{
    public MyUrlResolver()
    { }
    public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
    {
        if (File.Exists(System.Web.Hosting.HostingEnvironment.MapPath("~/dtd/xhtml11.dtd")))
        {
            absoluteUri = new Uri(System.Web.Hosting.HostingEnvironment.MapPath("~/dtd/xhtml11.dtd"));
        }
        return base.GetEntity(absoluteUri, role, ofObjectToReturn);
    }
    public override Uri ResolveUri(Uri baseUri, string relativeUri)
    {
        baseUri = new Uri(System.Web.Hosting.HostingEnvironment.MapPath("~"));
        relativeUri = "dtd/xhtml11.dtd";
        return base.ResolveUri(baseUri, relativeUri);
    }
}

在读取xml时发生验证,我得到异常:

参数entity ' html-inlstyle。Mod引用了自己。第111行,第21位

这里出现错误:

   <!-- Inline Style Module  ........................................ -->
<!ENTITY % xhtml-inlstyle.module "INCLUDE" >
<![%xhtml-inlstyle.module;[
<!ENTITY % xhtml-inlstyle.mod
     PUBLIC "-//W3C//ELEMENTS XHTML Inline Style 1.0//EN"
            "http://www.w3.org/MarkUp/DTD/xhtml-inlstyle-1.mod" >
%xhtml-inlstyle.mod;]]>

我不明白为什么官方dtd是错误的:/我该怎么办?

XHTML 1.1验证错误:"Parameter entity 'itself"引用

哎呀!dtd有时会变得相当复杂。

让我们反汇编DTD片段。为了清楚起见,我重新换行并添加了行号。

1.    <!ENTITY % xhtml-inlstyle.module "INCLUDE" >
2.    <![%xhtml-inlstyle.module;[
3.    <!ENTITY % xhtml-inlstyle.mod PUBLIC "-//W3C//ELEMENTS XHTML Inline Style 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-inlstyle-1.mod" >
4.    %xhtml-inlstyle.mod;]]>

在这种形式中,我们可以说第1行和第3行是实体声明,第2行和第4行是包含实体引用的文本。

第一行是一个普通的旧文字值实体,我将添加替换文本来代替第2行中的引用。为了增加清晰度,我将省略第一行,添加一些空白作为缩进和换行。然后是:

2.    <![INCLUDE[
3.        <!ENTITY % xhtml-inlstyle.mod PUBLIC "-//W3C//ELEMENTS XHTML Inline Style 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-inlstyle-1.mod" >
4.        %xhtml-inlstyle.mod;
5.    ]]>

第2行变成带有INCLUDE关键字的标记节声明。第3行部分的内容是一个实体声明,其实体文本不是字面量,而是一个外部实体声明,因为关键字PUBLIC。这意味着替换文本不是下面引用的文本,而是引用文档的内容,其位置由正式的公共标识符和系统标识符(URL)指定。如果您足够幸运,并且跟随行尾的URL不会给您超时错误,您将看到这个外部DTD的内容实际上是两个参数实体声明。分别是:<!ENTITY % style.attrib "style CDATA #IMPLIED"><!ENTITY % Core.extra.attrib "%style.attrib;" >。通过在第4行展开实体引用,您的原始DTD片段在技术上得到以下DTD片段:

<![INCLUDE[
    <!ENTITY % style.attrib "style CDATA #IMPLIED">
    <!ENTITY % Core.extra.attrib "%style.attrib;" >
]]>

这在我看来并没有太大的错误,但同行评审当然是值得赞赏的。因此,下一个问题是:为什么会产生错误,什么可能导致错误?

我想到的一些可能性:

所处理的语法是否正确,是否与此处显示的相同?如果在第二个实体声明的末尾缺少>字符,则在引用同一实体之前(在第4行)不会终止。解析声明是否仅当它写在单行上时才有效?试着重新包装一下。解析器是否理解除了具有文字值的实体声明之外的任何其他实体声明?尝试使用公共标识符创建类似的实体声明,但不要首先引用它。问题是由(公共/系统)标识符的解析方式引起的吗?您是否有DTD目录,您是否通过网络将可能的DTD查找重定向到您的本地副本,如果您将URL更改为本地文件(或不太可能超时的地方)会发生什么等等。是否围绕实体声明的INCLUDE声明导致它失败?尝试将其移动到INCLUDE声明之上,这样它也可以在实体引用之前。如果INCLUDE工作,尝试使用我的最后一个DTD片段也会导致错误。

顺便说一下。XHTML 1.1 DTD包含许多与此类似的其他include结构,因此这可能不是唯一会引发错误的地方。这只是第一次。

我将以坏消息结束这篇文章。如果这个问题不是由于某些人为错误,比如实际DTD文件中放错位置或缺少字符,或者不是由于外部DTD资源的检索方式,那么我猜这个问题是由解析器上的错误/不支持的特性引起的(可能不会很快得到修复),或者(尽管错误清楚地指向DTD文件),这是由您的c#代码中的某些东西引起的,与这里的其他人相比,我对此一无所知,无法进一步帮助您。不管怎样,调试愉快!

可以根据xhtml11-flat进行验证。Dtd,它是xhtml11的聚合。DTD和所有的*。Mod由xhtml11.dtd引用的文件。

这样做,你应该调整你的自定义'MyUrlResolver'类一点点返回'xhtml11-flat。Dtd '代替'xhtml11.dtd'。

我的解决方案是下载xhtml11。DTD和所有*。Mod文件引用到dtd。然后在dtd中删除指向

的http链接
    <!ENTITY % xhtml-datatypes.module "INCLUDE" >
<![%xhtml-datatypes.module;[
<!ENTITY % xhtml-datatypes.mod
     PUBLIC "-//W3C//ENTITIES XHTML Datatypes 1.0//EN"
            "xhtml-datatypes-1.mod" >
%xhtml-datatypes.mod;]]>

现在在验证期间,html页面可以使用本地dtd而无需从www下载;)