--------------------XML 标记语言--------------------
1. XML简介
1)标记:是一种传输元数据的方法。
标记就像标点符号一样,用来定义文档的结构,以及语句是在哪里开始,到哪里结束。只是
这里所说的标记是用在应用程序上的。用来告诉应用程序如何处理和表示文档。
2)语言:整套用来定义语法和文法的标记集合,称为语言
3)SGML: standard Generalized Markup Language. 标准通用标记语言。1986年被ISO接受为
国际性的数据存储和交换的标准。
SGML 非常强大,但也非常复杂
4)XML:XML是SGML的一个子集,要比SGML简单的多
XML是一种界定文本数据的简便而标准的方法,曾经被人称为WEB上的ASCII码
5)XML 和 HTML 之间的联系和区别
XML基于ISO/IEC10646字符集标准(等同于Unicode标准)中定义的通用字符集UCS。
XML注重的是数据本身,而HTML注重数据以及数据的表达方式。
XML不是编程语言,而HTML是一门编程语言。
HTML采用固定的标记集,XML的标记集是可以扩展的。
6)DTD 文档类型定义 Document Type Definition
表述XML文档结构的机制
确保能在应用程序中使用XML文档
7)任何一门语言都有其特定的应用领域,也就是说很难有一门语言可以解决所有领域的信息
表达、存储以及交换问题。因此,XML应用在WEB领域用来传输数据是非常完美的,但是它却不
能像HTML 这样表达数据。
8)数据交互新方式 ---词汇表
背景:由于浏览器的开发者不断的添加新的标记和功能,但这些标记都只是特定的浏览器
以及各自公司的半专业化的,在其他的浏览器上经常会出现不兼容的问题。虽然有新功能的丰富
但大多数这些新增的标记和功能都是专用的。所以并没有对数据建模、语义标记或者结构化信息
交换协议上位HTML提供多少帮助。
XML词汇表共享解决了这个问题。它为不同的组织和计算机应用程序之间交换信息提供了一条
途径。
词汇表,对XML数据的描述,信息交换的媒介,通常由一组公司协作制定。
几种常见的词汇表:
科学词汇表:CML 化学标记语言、BSML 用于基因序列和映射信息
商业词汇表:
法律词汇表
医学词汇表
计算机词汇表
9)XML编写规则
a. 所有的XML都必须关闭标签
b. 标签对对大小写敏感
c. 必须正确的嵌套
d. 必须要有根元素
e. 所有的属性值必须加引号
f. 实体的引用,
在XML中,一些特殊的字符可以通过引用来实现。
XML中 5个预定义的实体引用:
<
<
>
>
&
&
'
'
"
"
注释:在 XML 中,只有字符 "<" 和 "&" 确实是非法的。大于号是合法的,但是用
实体引用来代替它是一个好习惯。
g.
注释
<!-- this is comment -->
h. XML中,空格会被保留下来
i. XML以 LF 存储换行
注: 换行: windows 回车(CR-LF) unix (LF) macintosh(CR)
2. XML
3. DOCTYPE 声明
用于指定当前XML文件, 采用何种 DTD 文档的定义来解析。
例如:
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
注释:
0) plist顶级元素,指定DTD 中定义的顶级元素的类型
1)- 表明 后面所写的组织并没用经过ISO注册过
不写就是默认已经注册过 +
2)Apple 创建和维护该文档的团体或者组织名称
3) DTD 文档类型
4) PLIST 标签:指定的公开文本唯一性描述名称,后面可以带版本号 ???
5) 1.0 版本号
6) EN 语言,即用于创建所引用对象的自然语言编码系统
7) PUBLIC | SYSTEM 可用性
PUBLIC 公开的
SYSTEM 本地资源或者URL
8) "http://www.apple.com/DTDs/PropertyList-1.0.dtd" 引用的文件的位置
-------------------------DTD 文档类型定义---------------------------
2.DTD
1. 基础概念
A) CDATA
字符数据,不会被解析器解析的文本。该值类型的数据中的标签不会被当作标记来解析。
B) PCDATA
字符数据,会被解析器解析的文本。如果该值类型的数据中包含的标签,它将会被解析处
理。
C) 元素
构建XML 及HTML 的结构模块。 如<body>..</body>
D) 实体
普通文本或者特殊字符引用变量
E) 属性
用来提供给元素的额外信息。
F) XML DTD文档声明
1)内部的 DOCTYPE 声明
<!DOCTYPE 根元素 [元素声明]>
2)外部文档声明
<!DOCTYPE 根元素 SYSTEM "文件名">
2. DTD 元素
1)元素的声明
<!ELEMENT 元素名称 类别>
或
<!ELEMENT 元素名称 (子元素, 子元素)>
2)类别
A) 空元素
EMPTY
<!ELEMENT ture EMPTY>
B) 任何内容的元素
ANY
<!ELEMENT note ANY>
C) PCDATA元素
PCDATA
<!ELEMENT to (#PCDATA)>
D) 没有 CDATA元素
CDATA
注意:元素的没有 CDATA类型
////////////////////////////////////////////
//注意: 下面所有元素声明中,如果包含了子元素,或者子元素序列,则下面也必须
按着该序列来对子元素进行声明。???
E) 带有子元素(序列)的元素
<!ELEMENT 元素名称 (子元素1)> 或
<!ELEMENT 元素名称 (子元素1, 子元素2...)>
例如:
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
<!ENTITY % plistObject "(array | data | date | dict | real | integer | string | true | false )" >
<!ELEMENT plist %plistObject;>
F) 只出现一次的元素
<!ELEMENT 元素名称 (子元素名称)>
<!ELEMENT note (message)>
在note 元素内 message 子元素必须出现一次,并且只能出现一次。
H) 最少只出现一次的元素
+
<!ELEMENT 元素名称 (子元素名称+)>
I) 声明出现零次或多次的元素
*
<!ELEMENT 元素名称 (子元素名称*)>
J) 声明出现零次或一次的元素
?
<!ELEMENT 元素名称 (子元素名称?)>
K) 声明“非.../既...”类型的内容
<!ELEMENT 元素名称 (子元素1, 子元素2, (子元素3 | 子元素4))>
如果
子元素3出现,则 子元素4 不出现
L) 声明混合型的内容
*
<!ELEMENT 元素名称 (其他声明|子元素 | 子元素)*>
注:混合声明中使用 实体:???
3. DTD 属性
1)声明属性
单个属性:<!ATTLIST 元素名称 属性名 属性类型 默认值类型>
多个属性:<!ATTLIST 元素名称
属性1 属性1类型 属性1默认值类型
属性2 属性2类型 属性2默认值类型
属性3 属性3类型 属性3默认值类型
...
>
注: 多个属性书写时,可以写在一行,中间用空格隔开就可以了
例如:
DTD: <!ATTLIST plist version CDATA "1.0">
对应的
XML: <plist version="1.0"/>
comment: CDATA 类型表示,值为字符数据集
DTD: <!ATTLIST people
id CDATA #REQUIRED
name CDATA #REQUIRED
sex
CDATA #REQUIRED
>
XML : <people id="1" name="hello" sex="man">
2)属性类型
CDATA
值为字符数据
(en1| en2| en3|...)
值为枚举列表中过的值
ID
值为唯一的
IDREF
值为另一个ID的引用
IDREFS
值为另一个ID的引用列表
NMTOKEN
值为合法的XML名称
NMTOKENS
值为合法的XML名称列表
ENTITY
值为一个实体
ENTITIES
值为一个实体列表
NOTATION
值为一个符号的名称
xml:
值为一个预定义的XML名称值
例如:
1. 枚举列表
<!ATTLIST plist abc (check | cash| try) "try">
2. ID 及 IDREF / IDREFS
???
ID 类型声明的属性值类型,整个文档都不能有重复。即使不在同一结构里
IDREF 类型声明的属性值类型,为另一个ID的值。
IDREFS 存在的ID列表。ID之间用空格隔开
ID 必须以 字符 下划线开头
3. NMTOKEN / NMTOKENS
???
一个合法的XML名称,只判断文件名是否合法,NMTOKENS为 XML名列表,以空格
隔开
4. ENTITY /ENTITIES
指定属性值得类型为 实体或者实体列表
5. NOTATION
设定 NOTATION类型的属性,可以向应用程序指定一个外部的处理程序。
MIME类型: <!NOTATION 记号名 SYSTEM "MIME类型">
应用程序路径: <!NOTATION 记号名 SYSTEM "URL路径名">
<!ATTLIST 电影 演示设备 NOTATION ( mp | gif ) #REQUIRED>
<!NOTATION mp SYSTEM "movPlayer.exe">
<!NOTATION gif SYSTEM "Image/gif">
NOTATION 包含的符号都需要单独用 NOTATION 声明
<!ENTITY ICON SYSTEM "D:\Codes\XML\b1.gif" NDATA FF>
不直接解析 ICON 引用的对象,需要借助 FF 符号所指的程序来解析。因此
FF也是需要下面NOTATION 语句来声明
<!NOTATION FF SYSTEM "iexplore.exe">
3) 默认值类型
值
属性的默认值
#REQUIRED
属性值是必需的
#IMPLIED
属性值是不必需的
#FIXED value
属性值是固定的
例如:
<!ATTLIST plist abc CDATA #REQUIRED>
<!ATTLIST plist abc CDATA #FIXED "1">
<!ATTLIST plist abc CDATA #IMPLIED>
<contact fax="123">
或者
<contact/>
4. DTD 实体
A)概念:
实体是用于定义普通文本和特殊字符的快捷方式的变量
实体分为通用实体和参数实体。还可以分为未解析和解析实体。
通用实体:用于引用文本或者二进制数据,主要用在XML文件中
参数实体:用于DTD文件中
B)声明
定义在当前DTD文档内部的:
通用实体声明:
<!ENTITY 实体名称 "实体的值">
参数实体声明:
<!ENTITY % 实体名称 "实体的值">
定义在当前DTD文档外部的:
通用实体声明:
<!ENTITY 实体名称 SYSTEM "URI">
<!ENTITY 实体名称 PUBLIC "public_ID" "URI">
参数实体声明:
<!ENTITY % 实体名称 SYSTEM "URI">
<!ENTITY % 实体名称 PUBLIC "public_ID" "URI">
通用外部未解析实体:
<!ENTITY 实体名 SYSTEM 二进制数据位置 NDATA 标记名称>
<!ENTITY background SYSTEM "background.png" NDATA PNG>
例子:
1) 一个内部实体的声明
<!ENTITY writer "emptylau“>
<!ENTITY copyright "Copyright www.emptylau.com">
2) 外部实体声明 SYSTEM / PUBLIC
<!ENTITY 实体名称 SYSTEM "URI/URL">
<!ENTITY writer SYSTEM "http://www.empytlau.com/entities.dtd">
<!ENTITY 实体名称 PUBLIC "public_ID” "URL">
注解:
URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。
而URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用
来标识一个资源,而且还指明了如何locate这个资源。而URN,uniform resource name,
统一资源命名,是通过名字来标识资源,比如mailto:
[email protected]。也就是说,
URI是以一种抽象的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。
URL和URN都是一种URI
C)XML 中实体的引用
XML 中是的引用包括三部分构成 一个和号(&), 一个实体名称 以及一个分号(;)
通用实体:
<anchor>&writer; ©right; </anchor>
参数实体:
<anchor>%writer; %copyright;</anchor>
D) 通用实体 和参数实体 区别
上面在介绍的所涉及的都是通用实体。下面是一个参数实体的例子:
参数实体:
<!ENTITY % peopleParameters "age CDATA #IMPLIED weight CDATA #IMPLIED height CDATA #REQUIRED">
<!ATTLIST InsuredPerson %peopleParameters; carrier CDATA #REQUIRED >
参数实体在声明和使用方式上同通用实体本质上是一样的。只是这里使用的
是 % 百分号
<!ENTITY % myParm SYSTEM "HTTP://WWW.GOOTRY.COM" >
1)通用实体既可以在DTD文档中引用,也可以在XML文档中引用。参数实体只能在DTD文档
中引用
2) 通用实体不能作为独立的DTD声明语句,参数实体可以。
参数实体主要功能是用在DTD文档中,用作声明时使用;通用实体主要用在XML
文档中使用。
E) 实体可以嵌套使用
<!ENTITY note "xml">
<!ENTITY description "¬e; 2014-8-3">
注意:不要写成死循环