什么是XHtml:
摘錄網上的一句話,XHTML就是一個扮演着類似HTML的角色的XML。
XHtml可當模板引擎應用:
CYQ.Data 框架里有一套XHtmlAction模板引擎, 應用在QBlog開源博客里。
簡單說,把Html當Xml進行Load加載,再使用常規的Xml語法就可以對模板進行增刪改查等操作。
為啥不是Html,而是XHtml?
Html的語法約束不嚴格,任你標簽不閉合,或者標簽錯亂,也能被瀏覽器解析,或忽略,或錯位,或XX;
如果直接解析使用Html,沒約束意味着無規則,存在萬一的可能性,操作起來復雜度或考慮的因素過多,成本是相當高的。
而使用XHtml,由於語法上歸屬Xml,所以可以直接使用使用XmlDocument對象操縱,直接方便。
XHtml注意事項:
我們寫Html時,經常會有:
<meta name="robots" content="all"> 或者:<img src='http://xx.gif' border='0'>
而XHtml受xml語法約束時:
1:單獨標簽必須有"/>"閉合;
2:屬性只能用雙引號,不能用單引號,同樣要標簽閉合。
對於模板來說,讓制作生成Html模板的人,注意下這個事項,也是可控的小事。
用XmlDocument操作Html必然會遇到的難題:
DTD(Document Type Definition)?
我用通俗的流程講,如果我用XmlDocument.Load(Html) 去加載一個Html模板,如果這個Html帶有&nsb;等實體符號,那么加載就會失敗拋異常如下:
DTD就常在你眼前,只是你視而不見:
當我們新建一個Html的時候,我們在第一行就可以看見DTD的引用標簽:
< html xmlns ="http://www.w3.org/1999/xhtml" >
< head >
< title >無標題頁 </ title >
</ head >
< body >
</ body >
</ html >
可以看見,默認都是W3組織提供的,地址也是一個遠程地址,對於瀏覽器而言,它要解析實體,也要引用DTD。
只是瀏覽器通常會把DTD在本地集成,不會每次都去遠程下載。
同樣的,而我們需要操作Html時,需要引入這個DTD文件。
XmlDocument如何引用DTD:
只要設置XmlDocument的屬性XmlResolver=new XmlUrlResolver();即可。
當我們Load(Html)時,默認若有dtd地址(指向遠程w3服務器的),如果每次都從服務器讀取,勢必是不可取的,加載速度會也會因網絡卡一卡。
DTD引用的優化,同樣下載DTD到本地:
為了提升解析速度,所以把DTD文件下載到本地是不二的做法,所以你如果看見QBlog的源碼項目里,也會有這樣一個目錄:
同樣的,為了修改遠程路徑為本地路徑,我們實現自己的XmlUrlResolver類:下面是CYQ.Data里的實現代碼:
其實就是一個繼承,重寫URI路徑指向本地文件。
在QBlog的歷史任務中,攻克DTD是一個相當沉重的課題
對於DTD的問題,相關的信息少之又少,而使用XmlDocument加載Html所遇到的DTD引用問題,更是幾乎找不到答案,加上那些年,知識所限,所以不得不謂之課題沉重。
更奇怪的是,在.NET的整個領域教學或教學書里,沒怎么見着有關DTD的相關信息:
教你Html的老師,從不講第一行為何物?
教你XML的老師,從不講命名空間及DTD?
那么DTD是什么呢?
如果想看官方長篇描述的,請自行搜索關鍵字”dtd“。
個人理解簡單的說:就是對xml的一種語法約束(折騰個游戲規則給你讓你玩)。
由於Html也基於xml后的一種擴展,所以同樣適用於Html。
以Html的Table元素示例了解下DTD:
對於html的table,正常我們的都知道它的常見子節點有tr、tbody。
那它能不能有個txx,tmdxx或tmdxxx?
答案是你可以亂加,但那是無效的,瀏覽器是會忽略的,因為dtd里沒有定義。
如果你下載DTD到本地,可以搜到對table的語法有這么一行:
大語就是元素table的子級只能有"caption,(col、colgroup)、 thread、tfoot、(tbody,tr)“
而?*+ |就是正則里的0或1次;0或N次,1或N次,x或Y。
那么Table表格都能有什么屬性呢?
%attrs;
summary %Text; #IMPLIED
width %Length; #IMPLIED
border %Pixels; #IMPLIED
frame %TFrame; #IMPLIED
rules %TRules; #IMPLIED
cellspacing %Length; #IMPLIED
cellpadding %Length; #IMPLIED
align %TAlign; #IMPLIED
bgcolor %Color; #IMPLIED
>
語法讀起來,基本就是:
summary 文字 默認(可選的)
width 長度 默認(可選的)
%Text,這里的%是個變量,往上可找一個定義:
語法基本上就是:CData是指字符串數據,然后把它定義為 % Text,然后其它地方引用就用%Text表示CData就是字符串了。
Html之所以為Html,那是因為有一個w3標准,用dtd給定義了所有的Html標簽的元素及屬性,所以A元素才有的href,Img元素有了src。
我們再回望:
意思是引入DTD文檔,html指文檔對html根元素開始生效,然后Public按字面意思理解,接着雙引號的內容是一個隨意起的名稱,之后是一個DTD的路徑。
以上說了這么多,大伙對DTD應該有一些了解了。
XSD(XML Schemas Definition)又出來了
上面剛說完,怎么又扯上XSD了,話說某組織覺的DTD在數據類型的約束上不夠細膩,只有字符類型,而沒有int,float,bool,date等,於是整出了另一個約束規范,就叫XSD了。
在哪可見XSD:
1: VS新建項時,可見:
2:Web.config的約束文件: DotNetConfig.xsd
對於web.config,一開始我以為采用dtd約束,找了三分鍾才發現,微軟就采用了xsd來約束,而不是dtd。
路徑就在:C:\Program Files (安裝目錄)\Microsoft Visual Studio 8\Xml\Schemas\DotNetConfig.xsd
若打開就是又一堆Xml語法了:
xsd架構的約束語法,是Web.config最最權威的指南,如果看的懂:什么web.config詳解文章的,都是浮雲了;如果看不懂,還是去看浮雲方便些。
當然,想學的話,搜索關鍵字”xsd 語法“。
總結:
本文不是百科全書,所以只寫我腦里存檔的那點知識,力求點到為止,更全的語法知識,還請自行搜索相關關鍵字。