HTML和XHTML的不同

摘要:现在有许多Web前端开发者可能仍然混淆HTML和XHTML这两种规范标准,虽然HTML和XHTML看起来在语法上类似,但在很多方面显著的不同。 本文详细介绍了这两者之间的区别不同。
  1. MIME[1]类型(MIME Types)
  2. 解析(Parsing)
  3. 语法(Syntax)
  4. 标记(Markup)
  5. 字符编码(Character Encoding)
  6. 脚本(Scripts)
  7. 样式表(Stylesheets)

  请注意以下信息是基于(X)HTML5的当前规范,某些技术上问题并不适用于HTML的早先版本。

  虽然HTML和XHTML看起来在语法上类似,但在很多方面显著的不同。 

注:由于当前的WHATWG[2]文档是一个草案,这个部分需要跟随一个变化的对象。标记@@@的不同是从理论上可以被改变且不影响向后兼容的不同。

  MIME类型(MIME Types)

  1. XHTML必须以XML MIME类型来提供,例如application/xml 或 application/xhtml+xml。
  2. HTML必须以text/html来提供。

  MIME类型决定了使用文件的类型。如果尝试使用text/html来发送XHTML,你实际上仅使用了HTML,可能有语法错误。

技术上,依据规范,XHTML1.0被允许作为text/html来发送。但是正是由于上面的原因,这样的一个文件被认为是HTML文件而不是XHTML文件

  解析(Parsing)

  XHTML用XML解析请求。HTML用它自己定义的更接近当前浏览器实际处理HTML的方式。

  1. 在XHTML中,良构性(well-formedness)错误是致命的。在HTML中,错误处理规则更加优雅。良构性错误在HTML也是语法错误,包括以下:
    1. 未编码的和符号(&替代&amp;)和小于符号(<替代&lt;)(这并不应用于CDATA)。(注:在HTML中,未编码的和符号在一些情况下是被允许的。)
    2. 注释包含额外的连接字符或以一个连接字符结尾。例如:<!--语法--错误--> or <!--语法错误--->
    3. 不匹配结束标签。(不适用于可选标签元素)
    4. 不闭合标签。
    5. 非法字符出现在属性名称前或中。
    6. 文件结束(EOF)意外发生。
    7. 非法的字符出现在DOCTYPE名前。
    8. 丢失DOCTYPE名。
    9. 在DOCTYPE中PUBLIC标识符没有SYSTEM标识符。(注:在HTML5中包含这些中的任何一个是语法错误,在XML中允许唯一的SYSTEM标识符出现在它自己中。)
    10. 有属性的结束标签。
    11. 非法结束标签。(在HTML中,一个非法的</br>和</p>会导致产生隐含在它之前的开始标签。)
  1. 内部子集在XML中是允许的,在HTML中是无意义的(且被禁止)
    1. 在一些情况下,HTML中的内部子集最终部分内联呈现。
  2. 当符号序列“]]>”在内容中不标记一个CDATA段的结束时,在XHTML中是一个良构性错误,但在HTML中是有效的。
  3. <![CDATA[...]]>,在XHTML中是一个CDATA片段,在HTML中是一个伪造的注释。
  4. <?foo …?>,在XHTML中是一个处理指令,在HTML中是一个伪造的注释。
  5. 在HTML中,用于空元素语法的尾部斜线在非空(non-void)元素(见下)中会有解析错误,但在所有情况下都被忽略。
  6. 在HTML中,script和style元素作为CDATA解析。(注:这个CDATA的定义不同于XML中的。)在XML中,它们作为普通元素解析(这意味着注释被当着真正的注释,看起来像起始标签的就是起始标签)。
  7. 在HTML中,title和textarea元素作为RCDATA被解析。(RCDATA定义不同于SGML中的,也不是XML的RCDATA.)
  8. 在HTML中,如果脚本执行(scripting)是可用,noscript元素作为CDATA被解析。如果脚本执行是不可用的,它作为PCDATA被解析。在XHTML中,这个元素是没有作用的,当脚本执行不可用时,不能真正被用于阻止内容将要呈现。
  9. 在HTML中,iframe,noembed和noframes作为CDATA解析。在XHTML中作为普通元素被解析,因此不能阻止内容被使用。
  10. 在XHTML中属性值的空格(white space)符被标准化为空白[3]
  11. 在HTML中,可选标签的元素在特定情况下被隐藏。
  12. 在HTML中,在body中出现的带标签的title元素被转移到head中。在XHTML中,它停在指定它的地方。
  13. 在HTML中,脱离上下文(context)出现的特定元素的标签被忽略。包括:caption,col,colgroup,frame, frameset,head,option,optgroup,tbody,td,tfoot,th,thead,tr。
  14. plaintext在HTML中有一个特别的解析请求。(无论如何,它都是被禁止的。)
  15. 这并不是全部的在HTML中发生的边界状态和错误条件。

  语法(Syntax)

  1. 在HTML中,doctype是必须的。在XHTML中是可选的。
  2. 在XHTML中,标签名和属性名是大小写敏感的。在HTML中,它们是不敏感的。
  3. 在XHTML中,非空元素必须有一个开始标签和一个结束标签。在HTML中,某些元素允许省略一个或两个标签。
    1. html (两个)
    2. head (两个)
    3. body(两个)
    4. li (结束标签)
    5. dt (结束标签)
    6. dd (结束标签)
    7. p (结束标签)
    8. colgroup (两个)
    9. thead (结束标签)
    10. tbody(两个)
    11. tfoot (结束标签)
    12. tr (结束标签)
    13. td (结束标签)
    14. th (结束标签)
  4. 在XHTML中,空元素可以用空元素语法(<br />)或一个结束标签紧跟在开始标签的后面(<br>&lt/br>)。在HTML中,空元素(empty elements)语法(尾部斜线)允许出现在空元素(void elements)上[4],但是禁止在非空元素上。无论如何,它没有任何意义可言,可以省略。对于空元素,结束标签是禁止的。
    1. base, link, meta, hr, br, img, embed, param, area, col 和 input。
    2. 注:在解析请求时,下面的元素被当作空元素对待,因为它们是过时和不标准的。尾部斜线是不允许的:basefont, bgsound, spacer,wbr(在任何方式下这些元素都是不允许的,所以它们没有太多不同)。
  5. HTML允许属性最简化(minimisation),比如省略这个值,而XHTML不允许。
  6. HTML允许使用没有引号的属性值,而XHTML不允许。
  7. XHTML允许使用CDATA片段,而HTML不允许。
  8. XHTML允许处理指令,而HTML不允许。
  9. 在HTML中,所有实体引用(entity references)都是预定义的,不请求一个文档类型定义(DTD[5])。但是由于XHTML5没有DTD,实体引用不能用在XHTML中(包括5中预定义的实体:&ampamp;,&amplt;,&ampgt;,&ampquot; 和&ampapos;)。
    1. 可以用自己的验证解释器提供自己的DTD,但是浏览器不能使用这个验证解析器而将无法读取DTD。
  10. 一套合法的unicode字符集在XML1.0中的限制远超在HTML中。
  11. XHTML允许命名空间前缀,但是HTML禁止。

  标记(Markup)

  1. 在XHTML中,命名空间声明(xmlns属性)是必须的。在HTML中的html元素也允许xmlns属性出现,其值是”http://www.w3.org/1999/xhtml”。
    1. <html xmlns=”http://www.w3.org/1999/xhtml”>
    2. 在HTML中,xmlns没有绝对作用。它基本上是一个护身符。它被允许仅仅是为了从XHTML移植过来更容易。当被HTML解析器解析时,这个属性最终处于无效的(null)命名空间中。
    3. 在XML(和XML命名空间理解的解析器)中,xmlns属性是其命名空间声明机制的一部分,一个元素实际上在无效的命名空间中是不能有xmlns属性的。当DOM执行时,这个属性最终在”http://www.w3.org/2000/xmlns/”命名空间中。
  2. XHTML允许使用非XHTML元素和属性(在不同的命名空间),HTML不允许。
  3. XHTML用xml:lang属性,HTML用lang属性代替。
  4. XML ID引入xml:id,能用在XHTML中,但在HTML中没有作用。
  5. 在HTML中,noscript能被使用,在XHTML中,它是禁止的。
  6. HTML用base元素,XHTML用xml:base代替。
  7. 在XHTML中,p元素也许包含结构化的内联级(inline level)元素,包括blockquote, dl, menu, ol, ul, pre 和 table。在HTML序列化中,由于向后兼容的限制,这是不可能的(虽然它或许可以通过DOM操作实现)。
  8. 在XHTML中,table元素或许包含子tr元素。在HTML序列化中,由于向后兼容的限制,这是不可能的(虽然它或许可以通过DOM操作实现)。

  字符编码(Character Encoding)

  1. 在XHTML中,XML声明被用于指定的字符编码。在HTML中,禁止XML声明。
  2. 在HTML中,带有一个charset属性的meta可以用于代替。在XHTML中,如果有包含它,它是被禁止且忽略的。
  3. XHMTL的默认编码是依据XML规则,UTF-8或UTF-16。在HTML中如果没有声明编码,它应该决定执行一个特别的启发式的或退回到一个默认的值。(规范中本章节还未完成)

  脚本(Scripts)

  1. document.write()和document.writeln()不能用在XHTML中,但能用在HTML中。
  2. 在XHTML中,通过innerHTML属性获取的字符串必须是一个良构的XML片段。
  3. DOM APIs在XHTML中是大小写敏感的,但是一些在HTML中是不敏感的。(不适用于那些不在HTML命名空间的元素。)
    1. Element.tagName, Node.nodeName,和 Node.localName 返回是大写的值。
    2. Document.createElement()是大小写不敏感的(规范写法是小写)。
    3. Element.setAttributeNode()将会把属性名改成小写。
    4. Element.setAttribute()是大小写不敏感的(规范写法是小写)。
    5. Document.getElementsByTagName()和 Element.getElementsByTagName()是大小写不敏感的。
    6. Document.renameNode()。如果新的命名空间是HTML命名空间,在重命名执行之前新的合格的名字必须是小写。
  4. 在HTML中,Document.createElement()在HTML命名空间下创建一个元素。在XML(包括XHTML),这个被DOM2和DOM3定义的命名空间是空的。
  5. 在XHTML中,浏览器在这个领域缺乏通用性。在Firefox,这个命名空间依赖于MIME类型。在Opera它依赖于根元素,而在Safari,它一直是无效的。

  样式表(Stylesheets)

  1. 用于CSS中的选择器(selectors)匹配在XHTML中是大小写敏感的,在HTML中大小写不敏感的。
  2. 在HTML中在画布上渲染背景,CSS请求body元素的特殊处理,但不适用于XHTML。

原文: Differences Between HTML and XHTML

  • [1] MIME : Multipurpose Internet Mail Extensions是Internet的传输标准,它提供Web浏览器一种检视多种档案格式的方式。
  • [2] WHATWG:Web Hypertext Application Technology Working Group网页超文本技术工作小组。
  • [3] XML1.0对属性值进行了标准化。对于空格字符(#x20,#xD,#xA,#x9)加入了空白字符(#x20)变成了标准化的值。
  • [4] void elements是empty elements的新名字
  • [5] DTD(Document Type Definition):文档类型定义

你可能感兴趣的:(HTML和XHTML的不同)