代码之家  ›  专栏  ›  技术社区  ›  philipp

xhtml添加实体

  •  2
  • philipp  · 技术社区  · 12 年前

    我有一个网站,它是以xhtml的形式提供的(带有doctype的标题)。我从服务器获取数据,其中有时包含   实体当我尝试通过设置包含此内容的字符串时会导致错误的原因 innerHTML 。我是如何发现我可以在服务器端替换所有这些项目的,但我想知道的是:

    我还可以将此实体添加到doctype声明中,而不是在服务器上替换它吗?

    编辑:

    换句话说,为什么会这样:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"
    [
        <!ENTITY nbsp  "&#160;">
    ]>
    

    就是不工作?

    1 回复  |  直到 12 年前
        1
  •  1
  •   Brett Zamir    12 年前

    更新2:

    从…起 http://www.w3.org/TR/2008/WD-html5-20080610/dom.html#innerhtml1 (关于设置的第二部分),XHTML的算法似乎没有提到它是否知道DOCTYPE信息,尽管它至少知道名称空间。(注意:我切换到了更简单但符合标准的XHTML5 DOCTYPE。)

    我认为你可能会提供以下测试用例并将其报告为错误,或者可能会将其列入WhatWG邮件列表,因为我认为行为至少应该经过规范(除非是,我只是没有看到):

    <!DOCTYPE html [
        <!ENTITY nbsp "&#160;">
    ]>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <div id="a">old&nbsp;text</div>
    <script><![CDATA[
    document.getElementById('a').innerHTML = 'new&nbsp;text';
    ]]></script>
    </html>
    

    同时,如果你不想在服务器上更换,你可以使用下面的破解方法 DOMParser() 以下为:

    <!DOCTYPE html [
        <!ENTITY nbsp "&#160;">
    ]>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <div id="a">old&nbsp;text</div>
    <script><![CDATA[
    
    document.getElementById('a').innerHTML = new DOMParser().parseFromString(
        '<!DOCTYPE html [<!ENTITY nbsp "&#160;">]>'+
        '<html xmlns="http://www.w3.org/1999/xhtml">'+
          'new&nbsp;text'+
        '</html>',
        'application/xhtml+xml'
      ).documentElement.innerHTML;
    
    ]]></script>
    </html>