xhtml添加实体

时间:2012-09-24 12:50:43

标签: xhtml doctype xml-entities

我有一个以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 个答案:

答案 0 :(得分:1)

更新2:

http://www.w3.org/TR/2008/WD-html5-20080610/dom.html#innerhtml1(设置的第2部分),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>
相关问题