您的位置:首页 > 其它

XML语法以及DTD的详解

2016-10-17 22:36 501 查看

XML简介:

XML是指可扩展标记语言(eXtensible Markup Language),它是一种标记语言,很类似HTML。它被设计的宗旨是传输数据,而非显示数据。
XML标签没有被预定义,需要用户自行定义标签。
XML技术是W3C组织(World Wide Web Consortium万维网联盟)发布的,目前遵循的是W3C组织于2000年发布XML1.0规范。
XML被广泛认为是继Java之后在Internet上最激动人心的新技术。
XML技术用于解决什么问题?
XML是一种通用的数据交换格式。

在XML语言中,它允许用户自定义标签。一个标签用于描述一段数据;一个标签可分为开始标签和结束标签,在起始标签之间,又可以使用其它标签描述其它数据,以此来实现数据关系的描述。

XML中的数据必须通过软件程序来解析执行或显示,如IE;这样的解析程序称之为Parser(解析器)。

XML的常见应用:
XML技术用于保存有关系的数据之外,它还常用作软件配置文件,以描述程序模块之间的关系(如Struts、Spring、Hibernate都是基于XML作为配置文件的)。
在一个软件系统中,通过XML配置文件可以提高系统的灵活性。即程序的行为是通过XML文件配置的,而不是硬编码。
XML语法
一个XML文件分为如下几部分的内容:文档声明、元素、属性、注释、CDATA区、特殊字符、处理指令(Processing  Instruction)
(1)文档声明

在编写XML文档时,需要先使用文档声明来声明XML文档。且必须出现在文档的第一行。并且必须指定。
最简单的语法:<?xml  version="1.0"  ?>
用encoding属性说明文档所使用的字符编码。保存在硬盘上的文件编码要与声明的编码一致。
如:<?xml version="1.0" encoding="GB2312" ?>
用standalone属性说明文档是否独立,即是否依赖其他文档。如:<?xml version="1.0" standalone="yes" ?>yes表示不用引入外部文件,no需要引入。
(2)元素

XML元素指XML文件中出现的标签。一个标签分为起始和结束标签(不能省略)。一个标签有如下几种书写形式;包含标签主体:<mytag>some content </mytag> 和 不含标签主体:<mytag/>
一个标签中可以嵌套若干个子标签,但所有的标签必须合理的嵌套,不允许有交叉嵌套。
一个XML文档必须有且仅有一个根标签,其他标签都是这个根标签的子标签或孙标签。
对于XML标签中出现的所有空格和换行,XML解析程序都会当做标签内容进行处理。
由于在XML中,空格和换行都作为原始内容被处理,所以,在编写XML文件时,使用换行和缩进等方式来让源原文件中的内容清晰可读的习惯可能要被迫改变。
(3)命名规范
  一个XML元素可以包括字母、数字以及其他一些可见字符,但必须遵守下面的一些规范:

区分大小写,例如:<P>和<p> 是两个不同的标记。
不能以数字或"-"(中划线)开头。
不能以xml或(或XML、或Xml等)开头。
不能包含空格。
名称中间不能包含冒号(:)。
(4)属性

一个元素可以有多个属性,每个属性都有它自己的名称和取值,例如:<mytag name="value" ......>
属性值一定要用引号(单引号或双引号)引起来。
属性名的命名规范与元素的命名规范相同。
元素中的属性是不允许重复的。
在XML技术中,标签属性所代表的信息也可以被改成用子元素的形式来进行描述。
(5)注释
     XML中的注释语法为:<!--  注释内容  -->。
    注意事项:

XML声明之前不能有注释。
注释不能嵌套。例如: <!-- 大段注释  ...  <!--  有一段注释-->... -->是错误的。
(6)转义字符
     对于一些单个字符,若想显示其原始样式,也可以使用转义的形式给予处理。
     
特殊字符替代符号
&&
<<
>>
""
''
 
(7)CDATA区
  CDATA是Character Data的缩写。 作用是把标签当做普通内容; 语法格式: <![CDATA[内容]]> 举例如下:
   <![CDATA[
    <itcast>www.itcast.cn</itcast>
   ]]>  以上红色部分被当做普通文本而不是标签。
(8)处理指令
  处理指令,简称PI(Processing Instruction)。
  作用:用来指挥软件如何解析XML文档。
  语法:必须以“<?” 作为开头,以"?" 作为结尾。
  常用的处理指令如下:
    XML声明:<?xml version="1.0" encoding="GB2312" ?>
    xml-stylesheet指令:用于指示XML文档所使用的CSS样式XSL  <?xml-stylesheet type="text/css" href="some.css"> (注意:对中文命名的标签元素不起作用)

XML语法总结:

所有 XML 元素都须有关闭标签
XML 标签对大小写敏感
XML 必须正确地嵌套顺序
XML 文档必须有根元素(只有一个)
XML 的属性值须加引号
特殊字符必须转义 --- CDATA
XML 中的空格、回车换行会解析时被保留

 XML约束之DTD的使用

(1)为什么要有约束?

 XML都是用户自定义的标签,若出现小小的错误,软件程序将不能正确地获取文件中的内容而报错。(如:Tomcat)
XML技术中,可以编写一个文档来约束一个XML的书写规范,这个文档称之为约束。
两个概念:格式良好的XML:遵循XML语法的XML。有效的XML:遵循约束文档的XML
总之:约束文档定义了在XML中允许出现的元素名称、属性及元素出现的顺序等等。
(2)XML约束概述
     XML约束概念:在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。
     常用的约束技术:XML DTD 和XML Schema
(3)DTD约束快速入门
    DTD(Document Type Definition),全称为文档类型定义。
   book.xml
<span style="font-size:18px;"><?xml version="1.0" ?>
<!DOCTYPE书架  SYSTEM "book.dtd">
<书架>
<书>
<书名>葵花宝典</书名>
<作者>东方不败</作者>
<售价>59.00元</售价>
</书>
<书>
<书名>九阳神功</书名>
<作者>张无忌</作者>
<售价>57.00元</售价>
</书>
</书架>
</span>
   book.dtd
<span style="font-size:18px;"><!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
</span>
复杂标签:<!ELEMENT 标签名 (子节点)>
简单标签:<!ELEMENT 标签名 (#PCDATA)>
引入DTD:<!DOCTYPE 根节点 SYSTEM  "dtd的地址">

 (4)将DTD与XML文档关联的三种形式
   DTD约束既可以作为一个单独的文件编写,也可以在XML文件内编写。

使用内部DTD 。<!DOCTYPE 根节点  [DTD的代码]>
使用外部DTD。<!DOCTYPE 根节点 "DTD的地址">
使用网络DTD。<!DOCTYPE 根节点 PUBLIC  "DTD的名称"  "DTD的地址">
      常见的使用网络DTD约束有Struts2的框架。
  在XML文件内编写DTD
<span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 书架 [
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
]>
<书架>
<书>
<书名>Java就业培训教程</书名>
<作者>张孝祥</作者>
<售价>39.00元</售价>
</书>
...
</书架>
</span>
XML使用DOCTYPE声明语句来指明它所遵循的DTD文档,有两种形式:

当引用的DTD文档在本地时,采用如下方式:

<!DOCTYPE 根元素 SYSTEM “DTD文档路径”>

如:<!DOCTYPE 书架 SYSTEM “book.dtd”>

当引用的DTD文档在公共网络上时,采用如下方式:

<!DOCTYPE 根元素 PUBLIC “DTD名称” “DTD文档的URL”>

如:<!DOCTYPE web-app PUBLIC 
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

DTD约束语法细节

(1)DTD-定义元素
在DTD文档中使用ELEMENT关键字来声明一个XML元素。
语法:<!ELEMENT 元素名称  使用规则>
使用规则:

(#PCDATA)指示元素的主题内容只能是普通的文本。
EMPTY:用于指示元素的主体为空。比如<br/>
ANY:用于指示元素的主题内容为任意类型。
(子元素):指示元素中包含的子元素。
定义子元素及描述它们的关系:
  1) 如果子元素用逗号隔开,必须按照声明顺序去编写XML文档。
     例如:<!ELEMENT FILE(TITLE, AUTHOR, EMAIL)>
  2)如果子元素用"|" 分开,说明任选其一。
     例如:<!ELEMENT FILE(TITLE|AUTHOR|EMAIL)>
  3)用+、*、? 来表示元素出现的次数。
     如果元素后面没有+*?表示必须且只能出现一次。
     +:表示至少出现一次,一次或多次。
     *:表示可有可无,零次、一次或多次。
     ?:表示可以有也可以无,有的话只能出现一次。零次或一次。
    如:<!ELEMENT MYTITLE((TITLE*,AUTHOR?,EMAIL))*|COMMIT> 
(2)元素内容的类型



(3)元素ELEMENT定义



DTD属性(ATTLIST)定义

<!ATTLIST 元素名称
    属性名 属性类型  约束
    属性名 属性类型  约束
    ......
>
属性声明举例:
<!ATTLIST 商品
 类别 CDATA  #REQUIRED  必须的
 颜色 CDATA  #IMPLIED       可选的
>
对应的XML为:<商品 类别="服装" 颜色="黄色" />

属性值类型:

CDATA:表示属性的取值为普通的文本字符串。
ENUMERATED(DTD没有此关键字):表示枚举,只能从枚举列表中任选其一,如(鸡肉|牛肉|猪肉|鱼肉)
ID:表示属性的取值不能重复(不能只写数字)
设置说明:

#REQUIRED:表示该属性必须出现
#IMPLIED:表示该属性可有可无。
#FIXED:表示该属性的取值为一个固定值。语法:#FIXED "固定值"
直接值:表示属性的取值为默认值。
约束的四种形式:



DTD 定义属性示例一:
<!ATTLIST 页面作者
   姓名   CDATA    #IMPLIED
   年龄   CDATA    #IMPLIED
   联系信息  CDATA  #REQUIRED
   网站职务  CDATA  #FIXED  "页面作者"
   个人爱好  CDATA  "上网"
>
DTD 定义属性示例二:

属性的类型可以是一组取值的列表,在XML文件中设置的属性值只能是这个列表中的某个值(枚举)
<?xml version = "1.0" encoding="GB2312" standalone="yes"?>

<!DOCTYPE 购物篮 [
<!ELEMENT 肉 EMPTY>
<!ATTLIST 肉 品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉">

]> 

<购物篮>
<肉 品种="鱼肉"/>
<肉 品种="牛肉"/>
<肉/>

</购物篮>

DTD 定义属性示例三:

ID属性的值只能由字母,下划线开始,不能出现空白字符。表示属性的设置值是一个唯一值。
<span style="font-size:18px;"><?xml version = "1.0" encoding="GB2312" ?>

<!DOCTYPE 联系人列表[
<!ELEMENT 联系人列表 ANY>
<!ELEMENT 联系人(姓名,EMAIL)>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
<!ATTLIST 联系人 编号 ID #REQUIRED>
]>

<联系人列表>
<联系人 编号=“p1">
<姓名>张三</姓名>
<EMAIL>zhang@it315.org</EMAIL>
</联系人>
<联系人 编号=“p2">
<姓名>李四</姓名>
<EMAIL>li@it315.org</EMAIL>
</联系人>
</联系人列表></span>

实体的引入

实体定义:

实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了。
在DTD定义中,一条<!ENTITY …>语句用于定义一个实体。
<!ENTITY 别名 “值”>
在元素中引用  &别名;
定义引用实体:

概念:在DTD中定义,在XML中使用
语法:<!ENTITY 实体名称 “实体内容”>
引用方式(注意是在XML中使用):&实体名称;

DTD中定义:
<!ENTITY copyright “版权所有”>

XML中引用:
©right;

综合实例如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE TVSCHEDULE [
<!ELEMENT TVSCHEDULE (CHANNEL+)>
<!ELEMENT CHANNEL (BANNER,DAY+)>
<!ELEMENT BANNER (#PCDATA)>
<!ELEMENT DAY (DATE,(HOLIDAY|PROGRAMSLOT+)+)>
<!ELEMENT HOLIDAY (#PCDATA)>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT PROGRAMSLOT (TIME,TITLE,DESCRIPTION?)>
<!ELEMENT TIME (#PCDATA)>
<!ELEMENT TITLE (#PCDATA)>
<!ELEMENT DESCRIPTION (#PCDATA)>

<!ATTLIST TVSCHEDULE NAME CDATA #REQUIRED>
<!ATTLIST CHANNEL CHAN CDATA #REQUIRED>
<!ATTLIST PROGRAMSLOT VTR CDATA #IMPLIED>
<!ATTLIST TITLE RATING CDATA #IMPLIED>
<!ATTLIST TITLE LANGUAGE CDATA #IMPLIED>
]>

<TVSCHEDULE NAME="">
<CHANNEL CHAN="">
<BANNER>CCAV</BANNER>
<DAY>
<DATE>2014-11-17</DATE>
<PROGRAMSLOT>
<TIME>19:00</TIME>
<TITLE>新闻联播</TITLE>
</PROGRAMSLOT>
</DAY>
</CHANNEL>
</TVSCHEDULE>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: