什么是XHtml:

摘录网上的一句话,XHTML就是一个扮演着类似HTML的角色的XML。

XHtml可当模板引擎应用:

CYQ.Data 框架里有一套XHtmlAction模板引擎, 应用在QBlog开源博客里。

简单说,把Html当Xml进行Load加载,再使用常规的Xml语法就可以对模板进行增删改查等操作。

为啥不是Html,而是XHtml?

Html的语法约束不严格,任你标签不闭合,或者标签错乱,也能被浏览器解析,或忽略,或错位,或XX;

如果直接解析使用Html,没约束意味着无规则,存在万一的可能性,操作起来复杂度或考虑的因素过多,成本是相当高的。

而使用XHtml,由于语法上归属Xml,所以可以直接使用使用XmlDocument对象操纵,直接方便。

html和XHTML在编码时应该注意的问题

1.良构性错误在XHTML中是不允许的,例如:未编码的和符号(&替代&amp;)和小于符号(<替代&lt;)
2.在HTML中,script和style元素作为CDATA解析。在XML中,它们作为普通元素解析即若js代码中出现标签开始或结束幅,会被识别为标签,所以不要在js代码中使用<>,除非你的script标签加<![CDATA[...]]>标识。
3.document.write()和document.writeln()不能用在XHTML中
4.在XHTML中,通过innerHTML属性获取的字符串必须是一个良构的XML片段。

XHtml注意事项:

我们写Html时,经常会有:

<metaname="robots"content="all"> 或者:<img src=\'#\'" //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 语法“。

总结:

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

那点你不知道的XHtml(Xml+Html)语法基础(DTD、XSD)相关推荐

  1. python语法基础知识案例_Python 语法速览与实战清单

    本文是对于 现代 Python 开发:语法基础与工程实践的总结,更多 Python 相关资料参考 Python 学习与实践资料索引:本文参考了 Python Crash Course - Cheat ...

  2. jquery 语法基础

    来源:http://www.cnblogs.com/A_ming/archive/2011/05/04/2036293.html jquery 语法基础 基本语法: $("HTML元素&qu ...

  3. HTML、HTML5、XHTML、XML、XSL、DTD、XML Schema 简单介绍

    在学习 WEB 开发中,我们可能经常搞不清 HTML.HTML5.XHTML.XML.XSL.DTD.XML Schema 的概念,容易将其混为一谈,在网上搜集大量资料后,在此做一下总结. 在介绍上面 ...

  4. CSharp语法基础

    CSharp语法基础CSharp语法基础CSharp语法基础 常用工具类 1.开发环境 开发环境 第一个程序 认识CS项目 2.类型和变量 类型和变量 控制台输出 3.类和对象 添加类 字段和方法 构 ...

  5. WAP建站WML语言语法基础教程

    完成WAP服务器的建立和WAP浏览器的安装之后,我们接下来就可以使用WML语言来编写WAP网页或应用,并通过WAP服务器及浏览器进行调试.从本章开始我们将系统地学习WML语言,本章主要讲解WML语言的 ...

  6. PHP面试题及答案解析(1)—PHP语法基础

    1. strlen( )与 mb_strlen( )的作用分别是什么? strlen和mb_strlen都是用于获取字符串长度. strlen只针对单字节编码字符,也就是说它计算的是字符串的总字节数. ...

  7. uniapp 语法基础

    前言 本文主要讲述 uniapp 的语法基础,讲述了数据绑定.条件判断和列表渲染等常用知识点并结合案例 知识点 数据绑定 条件判断 列表渲染 数据绑定 插值 数据绑定常见形式之一:文本插值 {{ me ...

  8. Java基础笔记(入门,语法基础,流程控制,数组)

    Java语言入门 发展历程 三大技术体系 JavaSE 标准版 JavaEE 企业版 JavaME 嵌入式版 Java语言特点 简单性 健壮性 面向对象 分布式 多线程 动态性 可移植性(跨平台) J ...

  9. 给Java初学者福利——Java语法基础

    Java代码基本格式 Java中所有程序代码都必须存在于一个类中,用class关键字定义类,在class之前可以有一些修饰符.格式如下: 修饰符 class 类名 { 程序代码 } 注: 1.Java ...

  10. python语法基础知识总结-python语法基础知识

    一.数字类型及操作 1.整数类型 可正可负,无取值范围限制pow(x,y):计算x^y 2.浮点数类型 存在不确定尾数round(x,d):对x四舍五入,d为小数截取位数e/E:a*10^b 3.复数 ...

最新文章

  1. R绘制散点图以及带圈定的散点图(Scatterplot With Encircling)
  2. PYDay6- 内置函数、验证码、文件操作、发送邮件函数
  3. ASP.NET 大文件下载的实现思路及代码
  4. Imagenet VGG-19网络加载和特征可视化
  5. (转)WebSocket的原理
  6. 价值50万年薪的Java面试题
  7. phpcms父级调用二级子栏目名称和二级栏目文章 - 代码篇
  8. Android 两个Activity进行数据传送 发送
  9. unity 彩带粒子_Unity3d粒子特效:制作火焰效果
  10. Redis--五种基础数据结构及应用场景
  11. 怎么样打印cxgrid过滤后的数据
  12. python 招聘 少_Python招聘需求猛增123%!学完Python工资多少?
  13. java-设置电脑音量
  14. PyQt窗口设计之Qt Designer
  15. 调用notifyDataSetChanged无法更新ListView
  16. Javaweb1:HTML、各种标签
  17. 51单片机 :5RET与RETI
  18. 步进电机正反转实验_只用一个接触器实现三相电机正反转
  19. 微软鼠标测试软件,微软Precision鼠标评测:Surface生产力工具最佳搭配
  20. linux下/proc目录简介

热门文章

  1. LoRa无线模块的优势
  2. LaTex在线编辑工具overleaf在英文模板中输入中文
  3. ArcGIS超级工具目录
  4. Linux网络编程(Socket)(一)
  5. 企业微信开发实战(三、OA审批之回调通知、获取审批单号、审批详情)
  6. 【虚拟机】虚拟机vmware设置全屏(直接设置)
  7. html中如何使图片边框隐藏,css怎么去除图片边框
  8. LENS CRA和SENSOR CRA匹配问题解析
  9. 史上最全的oracle常用知识总结
  10. 企业为什么会遭到DDoS攻击?被DDoS攻击该怎么办?