HTML与XHTML和XHTML作为text / html与XHTML作为XHTML的主题非常复杂。不幸的是,由于信息大部分分散在网络上,或者被深深地埋在W3C技术术语中,因此很难获得完整的图像。此外,还有一些误传。我建议将其用作该主题的权威SO资源,描述以下方面的最重要方面:
两者的实际含义是什么?
什么是常见的陷阱?
正确的MIME类型对于每种类型有何重要性?
不同的浏览器如何处理它们?
我希望每种技术都能得到一个答案。我将其设置为社区Wiki,因此请不要编辑多余的答案,而要编辑答案以完成图片。随意从存根开始。也可以随时编辑此问题。
最佳答案
内容。
术语
自从HTML首次引入以来,多年来,官方规范中的术语已经发生了变化,这是描述这一问题的困难之一。以下内容基于HTML5术语。同样,"file"用作通用术语,表示文件,文档,输入流,八位位组流等,以避免进行精细区分。
语言和序列化
HTML和XHTML是根据语言和序列化定义的。
语言定义了元素和属性的词汇表以及它们的内容模型,即哪些元素允许在哪些其他元素内,哪些属性允许在哪个元素上以及每个元素和属性的目的和含义。
序列化定义了如何使用标记来描述文本文档中的这些元素和属性。这包括哪些标签是必需的,哪些可以推断,以及这些推断的规则。它描述了诸如如何标记空白元素(例如“>”和“/>”)以及何时需要引用属性值之类的事情。
技术指标
HTML 4.01规范是当前的规范,它同时定义了HTML语言和HTML序列化。
XML 1.0规范定义了序列化,但是保留了由其他规范(称为“XML应用程序”)定义的语言。
XHTML 1.0和1.1规范都在使用中。本质上,它们使用与HTML 4.01相同的语言,但使用不同的序列化,该序列化与XML 1.0规范兼容。即XHTML是XML应用程序。
HTML5(从2010-04-18开始,草案)规范描述了HTML和XHTML的新语言。该语言主要是HTML 4.01语言的超集,但仅旨在与现有Web工具(例如,浏览器,搜索引擎和创作工具)向后兼容,而与以前的规范(向后兼容)会产生差异。因此,某些元素的含义有时会从早期的规范中更改。同样,每个序列化都与当前工具向后兼容。
浏览器解析器和内容(MIME)类型
当文本文件发送到浏览器时,它将被解析为其内部内存结构(对象模型)。为此,它使用一个解析器,该解析器遵循HTML序列化规则或XML序列化规则。根据“内容类型” HTTP header 上的非本地文件,使用哪个解析器取决于它推断出的内容类型是什么。在内部,一旦文件被解析,浏览器就以几乎相同的方式对待对象模型,而不管它最初是使用HTML还是XHTML序列化提供的。
为了使浏览器使用其XHTML解析器,内容类型HTTP header 必须是XML内容类型之一。最常见的是
application/xml
或application/xhtml+xml
。任何非XML内容类型都将意味着该文件(无论它是否符合所有XHTML语言和序列化规则)都不会被浏览器视为XHTML处理。使用
text/html
的HTTP内容类型(或在大多数后备场景中,缺少内容类型或任何其他非XML类型)将导致浏览器使用其HTML序列化解析器。这两个解析器之间的主要区别在于HTML序列化解析器执行错误恢复。如果解析器的输入文件不符合HTML序列化规则,则解析器将以与以前的浏览器反向工程的方式恢复,并继续构建其对象模型,直到到达文件末尾。 HTML5包含恢复的第一个规范性定义,但是从2010-04-26开始,没有主流浏览器提供在发行版中启用的算法的实现。
相反,当XML序列化解析器遇到任何无法解释为XML的内容时(即发现文件格式不正确的XML),它将停止。 XML 1.0规范要求解析器这样做。
浏览器支持
大多数现代浏览器都支持HTML解析器和XML解析器。但是,在Microsoft Internet Explorer 8.0及更早版本中,XML解析器无法直接创建用于呈现为HTML页面的对象模型。但是,可以使用XSLT文件处理XML结构以创建流,然后使用HTML解析器对其进行解析以创建可以呈现的对象模型。
从Internet Explorer 9 Platform Preview开始,可以使用与其他现代浏览器相同的方式直接解析使用XML内容类型提供的XHTML。
当其XML解析器检测到其输入文件的XML格式不正确时,某些浏览器将显示错误消息,而另一些浏览器则将页面显示为已构造到检测到错误为止,还有一些浏览器为用户提供了获取文件的机会使用他们的HTML解析器重新解析。
验证器和文档类型定义
HTML和XHTML文件可以以文档类型定义(DTD)声明开头,该声明指示文档中使用的语言和序列化。验证程序(例如http://validator.w3.org/上的验证程序)使用此信息来将文件中使用的语言和序列化与DTD中定义的规则进行匹配。然后,它会根据文件中的标记违反DTD规则的位置来报告错误。
并非所有HTML序列化和语言规则都可以在DTD中描述,因此验证器仅测试规范描述的所有规则的子集。
HTML 4.01和XHTML 1.0定义了严格,过渡和框架集DTD,它们在兼容文件中允许的语言元素和属性上有所不同。
基于HTML5的验证器(例如validator.nu)的行为更类似于浏览器,根据HTTP内容类型处理页面,并使用基于非DTD的规则集,以使它们捕获DTD无法描述的错误。
怪癖,受限怪癖和标准模式。
浏览器不验证发送给他们的文件。他们也不使用任何DTD声明来确定文件的语言或序列化。但是,他们的确会用它来猜测页面创建的年代,并因此猜测作者当时对浏览器的预期解析和渲染行为。因此,它们定义了三种解析和渲染模式,称为Quirks模式,Limited Quirks(或几乎标准)模式和Standards模式。
使用XML内容类型提供的任何文件始终以标准模式处理。对于使用HTML解析器解析的文件,如果未提供DTD或DTD被确定为非常旧,则浏览器将使用其怪癖模式。概括地说,如果HTML 4.01和XHTML文件包含过渡DTD,则处理为text / html的HTML 4.01和XHTML文件将以有限的怪癖模式进行处理;如果使用严格的DTD,则将以标准模式进行处理。
在无法识别DTD的情况下,该模式由一组复杂的规则确定。一种特殊情况是省略了公共(public)标识符和系统标识符,并且声明仅是。这是最短的doctype声明,当前的浏览器会将其视为标准模式。因此,它是指定用于HTML5兼容文件的声明。
关于xhtml - HTML 4,HTML 5,XHTML,MIME类型-权威资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2662508/