vlambda博客
学习文章列表

HTML核心系列1之DTD与实体

简介:

Sgml、 HTML 和 XML 都是标记语言。 “标记”一词起源于编辑对作者手稿进行修改。编辑“标记”手稿,以突出某些领域。在计算机技术中,标记语言是一组单词和符号,它们突出显示文本以定义网页文档。例如,网页设计师使用标记语言来分隔段落并用黑体字表示字母。一旦理解了 SGML、 HTML 和 XML 在 web 设计中的作用,就会看到这些不同语言之间的相互关系。简而言之,SGML、 HTML 和 XML 是一系列有助于使网站功能化和网页设计动态化的语言。

SGML

在这个标记语言家族中,SGML 标记语言(SGML)是父语言。Sgml 提供了一种定义标记语言并为其表单设置标准的方法。换句话说,SGML 规定了某些语言可以或不可以做什么,必须包含哪些元素(如标记) ,以及语言的基本结构。当父代将遗传特征传递给子代时,SGML 将结构和格式规则传递给标记语言。

HTML

超文本标记语言是 SGML 的一个子程序,或者说应用程序。正是 HTML 为浏览器构建了页面。使用 HTML,您可以嵌入图像,创建页面部分,建立字体,并指导页面的流程。此外,使用 HTML,你可以通过脚本语言,如 JavaScript,为网站添加其他功能。Html 是网站设计的主要语言。

XML

XML 标记语言是 HTML 的近亲和 SGML 的侄子。尽管 XML 是一种标记语言,因此也是家族的一部分,但它具有与 HTML 不同的功能。Xml 是 SGML 的一个子集,它赋予它应用程序(如 HTML)所没有的权利。Xml 可以定义自己的应用程序。资源描述格式(RDF)是 XML 的一个应用。Html 仅限于设计,没有子集或应用程序。Xml 是 SGML 的精简版本,设计用于在有限的带宽下工作。Xml 继承了 SGML 的遗传特征,但是创建它自己的家庭。Xml 的子集包括 XSL 和 XSLT。

HTML语法组成

DTD

SGML(通用标记性语言),SGML是IBM公司1996年所使用的技术,在HTML5在前,HTML(超文本标记语言)和XML可以说是SGML中规定的一种格式,HTML作为SGML的子集.

它遵循着SGML基本语法和DTD(文档类型定义),SGML用DTD来定义每一种文档类型类型,在H5出现之前HTML都是使用符合SGML的DTD,可以把他看成是事先定义好的HTML和XML模板。

常见的HTML举例子:

<table border="1"
   <tr> 
      <td>这里可以放表格内容</td> 
   </tr> 
</table>

浏览器已经不用SGML引擎去解析上述HTML结构,而是SGML精简版XML去解析,其实XML也无法去直接解析,它不知道<table>...</table>是什么而是透过DTD事先定义好我们自定义的模板去解析的。如下:

<?xml version="1.0" ?> 
<!DOCTYPE table[ 
  <!ELEMENT table (tr)> 
  <!ELEMENT tr (#PCDATA)> 
  <!ELEMENT tr (td)> 
  <!ELEMENT td (#PCDATA)> 
] > 
<table border="1"
   <tr> 
      <td>这里可以放表格内容</td> 
   </tr> 
</table>

在HTML5之前HTML有三种格式DTD,分别是严格模式,过渡模式和framest模式(以下HTML4.01 又规定了 XHTML 语法版本)

  • 严格模式的 DTD 规定了 HTML4.01 中需要的标签。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
  • 过渡模式的 DTD 除了 html4.01,还包含了一些被贬斥的标签,这些标签已经不再推荐使 用了,但是过渡模式中仍保留了它们。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
  • frameset 结构的网页如今已经很少见到了,它使用 frameset 标签把几个网页组合到一 起
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"

在HTML5之后,由于这些DTD过于复杂的写法没啥实际用途,加之浏览器也不会使用SGML去解析他们,干脆放弃了SGML子集的 的支持,规定了一个简单易记住的DTD

<!DOCTYPE html>

DTD的重要组成部分

  • 元素
    元素是构成XML最重要的元件,其定义语法如下:
<!ELEMENT element-name category>
or
<!ELEMENT element-name (element-content)>

1.空元素
空元素用类别关键字EMPTY声明:

<!ELEMENT element-name EMPTY>
Example:
<!ELEMENT br EMPTY>
XML example:
<br />

2.具有已解析字符数据的元素
仅具有解析字符数据的元素在括号内用#PCDATA声明:

<!ELEMENT element-name (#PCDATA)>

Example:

<!ELEMENT tr (#PCDATA)>

3.具有任何内容的元素
使用类别关键字ANY声明的元素可以包含可分析数据的任意组合:

<!ELEMENT element-name ANY>

Example:

<!ELEMENT note ANY>
  • 属性

属性顾名思义就是要来辅助元素,帮元素宣告它的属性定义。

<!ATTLIST element-name attribute-name attribute-type attribute-value>

DTD example:

<!ATTLIST payment type CDATA "check">

XML example:

<payment type="check" />
  • 实体(Entily)
    实体用于定义特殊字符的快捷方式,实体可以声明为内部或外部。255个之多,以下会列举常用的
    内部声明实体:
 <!ENTITY entity-name "entity-value">

   //例子
   DTD Example:
  <!ENTITY writer "Donald Duck.">
  <!ENTITY copyright "Copyright W3Schools.">
  XML example:
  <author>&writer;&copyright;</author>
//注意:实体分为三部分:“&”号,实体名称和分号(;)。

实体是用来定义普通文本的变量。实体引用是对实体的引用。大多数朋友都了解这个 HTML 实体引用:" "。
这个"无折行空格"实体在 HTML 中被用于在某个文档中插入一个额外的空格。
当文档被 XML 解析器解析时,实体就会被展开。

外部声名实体:

<!ENTITY entity-name SYSTEM "URI/URL">
   
//例子
DTD Example:
<!ENTITY writer SYSTEM "https://www.w3schools.com/entities.dtd">
<!ENTITY copyright SYSTEM "https://www.w3schools.com/entities.dtd">

XML example:
<author>&writer;&copyright;</author>    

常用实体:


  • PCDATA

   PCDATA 的意思是被解析的字符数据(parsed character data)。

 可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。

PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。

文本中的标签会被当作标记来处理,而实体会被展开。
不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &amp;、&lt; 以及 &gt; 实体来
分 别替换它们。
  • CDATA

     CDATA 的意思是字符数据(character data)。

    CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。

DTD的有哪些优势

  • 使用DTD,独立的人群可以就交换数据的标准DTD达成共识。

  • 应用程序可以使用DTD来验证XML数据是否有效。