注意:这应该是这个问题的规范帖子。答案已经存在很多,但对各种差异的描述分散在各处,而且更多的时候,它们也提供了"我应该使用哪一个"的意见,我将在这里避免。
如果您有更多问题要问,或者您知道更多差异,请随时编辑。
XHTML和HTML有什么区别?XHTML不就是HTML的一个更严格的版本吗?如果XHTML的行为都相同,为什么会有不同版本的XHTML?
和XHTML有什么区别?
有很多不同之处。最主要的是XHTML是XML文档中的HTML,XML有不同的语法规则:
- 默认情况下,XML 具有不同的命名空间,因此您必须使用 HTML 命名空间,
xmlns="http://www.w3.org/1999/xhtml"
在 XHTML 文档中显式使用 HTML 命名空间 - XML 区分大小写,您必须对标记名称和属性使用小写,甚至十六进制字符引用中的
x
- XML没有可选的开始和结束标记,因此您必须完整地写出所有标记。
- 同样,XML 没有 void 标记,因此您必须自己用斜杠关闭每个 void 元素。
- 没有内容的非空元素可以在 XML 中编写为单个空元素标记。
- XML 可以包含 CDATA 节,即用
<![CDATA[
分隔的纯文本节。]]>
;HTML 不能 - 另一方面,XML 中没有 CDATA 或 PCDATA 元素或属性,因此您必须在任何地方(CDATA 部分除外)转义
<
符号。 - 属性值两边的引号在 XML 中不是可选的,并且没有属性最小化(仅名称属性)
- XML解析器不像HTML解析器那样宽容错误。
然后有几个与 XML 无关的差异:
- XHTML 文档始终以标准模式呈现,从不以怪癖模式呈现
- XHTML不会查看头部中的元命令来确定编码。事实上,W3C 验证器在 XHTML5 文件中将
<meta http-equiv="content-type" ...
标记为错误,但在 HTML5 文件中则不然。 - 早些时候,XHTML 1.0 严格和 HTML 4.01 严格 dtd 之间的不匹配会导致验证问题。XTHML 1.0 的定义缺少
<img>
和<form>
上的name
属性。这是一个错误,在XHTML 1.1中修复。
请注意,XHTML文档应提供正确的文件类型,即.xhtml文件扩展名或application/xhtml + xmlMIME类型。您不可能真正在 HTML 文档中使用 XHTML,因为浏览器不会通过查看内容来区分这两种语法,只能通过文件类型来区分。
换句话说,如果您有一个 HTML 文件,则其内容是 HTML,无论它是否包含有效的 XML。
关于语法规则值得一提的一点是标签名称的大小写。尽管 HTML 文档不区分大小写,但 DOM 实际上将标记名称公开为大写。这意味着在HTML下,像console.log(document.body.tagName);
这样的JavaScript命令将输出"BODY",而XHTML下的相同命令将输出"body"。
XHTML不就是HTML的更严格版本吗?
不,XML 与 HTML 具有不同的规则,但它不一定更严格。如果有的话,XML 的规则更少!
在 HTML 中,许多功能是可选的。您可以选择是否在属性值两边加上引号;在 XML 中,您没有这种选择。 在HTML中,你必须记住什么时候可以选择,什么时候没有:引号在<a href=http://my-website.com/?login=true>
中是可选的吗?在 XML 中,您不必考虑这一点。XML更容易。
在 HTML 中,某些元素被定义为原始文本元素,即包含纯文本而不是标记的元素。
其他一些元素是不可避免的原始文本元素,其中é
这样的引用将被解析,但像<b>bold</b>
和<!-- comment -->
这样的东西将被视为纯文本。如果你能记住这些元素是什么,你就不必逃避<
符号(你可以选择)。XML 没有这个,所以没有什么可记住的,所有元素都有相同的内容类型。
XML具有处理器指令,其中最著名的是prolog中的xml声明,<?xml version="1.0" encoding="windows-1252"?>
。这告诉浏览器使用哪个版本的 XML(顺便说一下,1.0 是唯一有效的版本)以及哪个字符集。
XML 以不同的方式解析注释。例如,HTML 注释不能以<!-->
开头(>
作为里面的第一个字符);XHTML注释可以。
说到注释,使用 XHTML,您可以使用<!-- comment -->
注释掉<script>
和<style>
元素中的代码块。不要在HTML中尝试。(由于兼容性问题,也不建议在 XHTML 中使用,但您可以。
如果XHTML的行为都相同,为什么会有不同版本的XHTML?
他们没有!例如,在XHTML 1.1中,你可以引用像é
和
这样的字符实体,因为这些实体是在DTD中定义的。当前版本的 XHTML(以前称为 XHTML5)没有 DTD,因此您必须使用数字引用,在本例中为é
和 
(或者在 DOCTYPE 声明中自行定义这些实体)。X毕竟意味着可扩展)。