一个非常简单的HTML文件。我故意放置所有必需的属性,即使它可能是一种矫枉过正。 (实际上,& eacute; 几乎所有浏览器都没有明确说明,但这只是一个突出问题的例子):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [
<!ENTITY eacute "é">
]>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<title>Test HTML with an entity</title>
</head>
<body lang="en">
<h1>Résumé</h1>
</body>
</html>
当我在浏览器中打开它时(我尝试过Firefox,Chrome,IE和Android WebView),它始终显示为
] GT;
恢复
我看不出原因]&gt;出现。当然,我删除了]&gt;在DOCTYPE中,一切都显得正常, 但是在这种情况下我的html不是有效的xml文件,因此在DOM中打开时会出错。
有什么建议吗?
答案 0 :(得分:0)
根据XML规则,您所做的是正确的,它实际上适用于支持XML的浏览器,当作为XML提供时;比照How do I define HTML entity references inside a valid XML document?
问题是如果文档在浏览器中作为旧版HTML 打开,它将由旧HTML原则处理。这意味着,除了其他内容之外,本书不会解析内部DTD子集(DOCTYPE
声明中括号中的内容);相反,当处理DOCTYPE
字符串时,浏览器以第一个>
字符结束,其余字符将作为字符数据使用。
所以问题不只是]>
。该构造根本不起作用,即没有定义实体。在示例中,显示“é”字符,但仅仅因为é
是在HTML中预定义的。如果您尝试定义<!ENTITY foo "é">
并使用&foo;
,则会逐字地看到&foo;
。
如果您的文档将作为旧版HTML处理,则无法定义实体引用。显然它当前是,因为示例文档在作为XML处理时根本不显示(它没有格式良好,所以只出现语法错误消息)。