XML 学习笔记<一>

来源:互联网 发布:影视特效软件 编辑:程序博客网 时间:2024/05/08 19:12
--------------------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个预定义的实体引用:
< &lt;
> &gt;
& &amp;
' &apos;
" &quot;
注释:在 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:java-net@java.sun.com。也就是说,
URI是以一种抽象的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。
URL和URN都是一种URI

C)XML 中实体的引用
XML 中是的引用包括三部分构成  一个和号(&), 一个实体名称 以及一个分号(;)

通用实体:
<anchor>&writer; &copyright; </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 "&note; 2014-8-3">
注意:不要写成死循环
0 0