HTML和XHTML的不同

作者: 秦歌 & Kaven  發布時間: 2010-09-12 22:29  閱讀: 3329 次  推薦: 1   原文鏈接   [收藏]  
摘要:現在有許多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
0
 
標簽:HTML XHTML W3C
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()