那点你不知道的XHtml(Xml+Html)语法知识(DTD、XSD)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:

什么是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的引用标签:

复制代码
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.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的语法有这么一行:

<! ELEMENT table     (caption?, (col*|colgroup*), thead?, tfoot?, (tbody+|tr+)) >

大语就是元素table的子级只能有"caption,(col、colgroup)、 thread、tfoot、(tbody,tr)“

而?*+ |就是正则里的0或1次;0或N次,1或N次,x或Y。

那么Table表格都能有什么属性呢?

复制代码
<! ATTLIST 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,这里的%是个变量,往上可找一个定义:

<! ENTITY % Text "CDATA" >

语法基本上就是:CData是指字符串数据,然后把它定义为 % Text,然后其它地方引用就用%Text表示CData就是字符串了。


Html之所以为Html,那是因为有一个w3标准,用dtd给定义了所有的Html标签的元素及属性,所以A元素才有的href,Img元素有了src。

我们再回望:

<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >

意思是引入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 语法“。

总结:

本文不是百科全书,所以只写我脑里存档的那点知识,力求点到为止,更全的语法知识,还请自行搜索相关关键字。


本文原创发表于博客园,作者为路过秋天,原文链接:http://www.cnblogs.com/cyq1162/p/3273607.html

相关文章
|
6月前
|
XML 存储 JSON
Twaver-HTML5基础学习(19)数据容器(2)_数据序列化_XML、Json
本文介绍了Twaver HTML5中的数据序列化,包括XML和JSON格式的序列化与反序列化方法。文章通过示例代码展示了如何将DataBox中的数据序列化为XML和JSON字符串,以及如何从这些字符串中反序列化数据,重建DataBox中的对象。此外,还提到了用户自定义属性的序列化注册方法。
76 1
|
3月前
|
XML 存储 数据格式
HTML(HyperText Markup Language)和XML(Extensible Markup Language)
HTML(HyperText Markup Language)和XML(Extensible Markup Language)
74 16
|
5月前
|
XML 存储 移动开发
|
10月前
|
XML 前端开发 数据格式
BeautifulSoup 是一个 Python 库,用于从 HTML 和 XML 文件中提取数据
【5月更文挑战第10天】BeautifulSoup 是 Python 的一个库,用于解析 HTML 和 XML 文件,即使在格式不规范的情况下也能有效工作。通过创建 BeautifulSoup 对象并使用方法如 find_all 和 get,可以方便地提取和查找文档中的信息。以下是一段示例代码,展示如何安装库、解析 HTML 数据以及打印段落、链接和特定类名的元素。BeautifulSoup 还支持更复杂的查询和文档修改功能。
204 1
|
5月前
|
XML Web App开发 数据格式
HTML 页面显示 XML 数据
10月更文挑战第2天
|
7月前
|
XML 数据格式
DTD和XML Schema之间的区别?
【8月更文挑战第22天】
109 0
|
9月前
|
XML 存储 前端开发
【前端】XML和HTML的区别详解
【前端】XML和HTML的区别详解
189 5
|
10月前
|
XML 存储 前端开发
【Web 前端】HTML、XHTML、XML 有什么区别?
【4月更文挑战第22天】【Web 前端】HTML、XHTML、XML 有什么区别?
|
10月前
|
XML JavaScript 数据格式
XML Schema(XSD)详解:定义 XML 文档结构合法性的完整指南
XML Schema(XSD)是用于定义XML文档结构的规范,它描述了元素、属性及其顺序、数据类型和约束。与DTD相比,XML Schema支持更多数据类型,如字符串、日期等,并且是基于XML的,允许扩展和重用。学习XML Schema有助于确保数据通信时双方对内容的理解一致,通过验证防止错误。示例展示了如何定义一个`note`元素,包含`to`, `from`, `heading`和`body`子元素,都是字符串类型。XML文档可以通过引用XML Schema进行验证,确保内容符合预设模式。
735 0
|
10月前
|
XML 存储 数据格式
探索 DTD 在 XML 中的作用及解析:深入理解文档类型定义
DTD(文档类型定义)用于定义XML文档的结构和合法元素、属性。它允许不同团体就数据交换标准达成一致,并用于验证XML数据的有效性。DTD可通过内部声明(在XML文档内)或外部声明(在单独文件中)来定义。内部声明示例显示了如何定义`note`元素及其子元素的结构,而外部声明则引用外部DTD文件。元素、属性、实体和PCDATA/CDATA是XML构建模块。DTD中,元素通过ELEMENT声明定义,属性通过ATTLIST声明定义,实体声明提供特殊字符或外部资源的快捷方式。
169 0