XML基础
- 在实际开发中,由于不同语言项目之间数据传递的格式有可能不兼容,导致这些项目在数据传输时变得很困难。为解决此问题,W3C组织推出了一种新的数据交换标准—XML
- XML是一种通用的数据交换格式,可以使数据在各种应用程序之间轻松地实现数据的交换
1.XML定义
- XML(Extensible Markup Language): 是可扩展标记语言。可扩展: 指用户可以按照XML规则自定义标记
- XML文件的用途:
- 1.作为系统与系统之间数据传输数据的格式
- 2.作为项目的配置文件
- 3.保存有结构关系型的数据
<?xml version="1.0" encoding="UTF-8"?> <中国>' <河北> <城市>张家口</城市> <城市>石家庄</城市> </河北> <山西> <城市>太原</城市> <城市>大同</城市> </山西> </中国>
- 语法说明:
- 第一行代码是XML的文档声明
- 下面的< 中国>< 河北>< 城市>都是用户自己的创建的标记,它们都可称为元素,这些元素必须成对出现,即包括开始标记和结束标记。
- < 中国>被视为整个XML文档的根元素,在它的下面有两个子元素,分别是< 河北>< 山西>,在这两个子元素中又分别包含两个< 城市>元素
- XML 和HTML的比较:
- XML(超文本)和HTML(可扩展)都是标记文本,它们在结构上大致相同,都是以标记的形式来描述信息。但是它们有着本质的区别
- 1.HTML是用来显示数据,XML是用来传输和存储数据
- 2.HTML是不区分大小写,XML是严格区分大小写
- 3.HTML可以有多个根元素,格式良好的XML有且只能有一个根元素
- 4.HTML中空格自动过滤,XML中空格不会自动删除
- 5.HTML中的标记是预定义,XML中的标记可以根据需要自己定义,并且可以扩展
- 总之XML不是HTML的升级,也不是HTML的替代产品,虽然两者有些相似,但它们的应用领域和范围完全不同
2.XML语法
- 1.文档声明
- 一个完整的XML文档,必须包含一个XML文档的声明,且该声明必须位于文档的第一行第一列
- 声明表示该文档是一个XML文档,且遵循的XML版本的规范
- 语法格式:
<?xml 版本信息 [编码信息] [文档独立性信息]?>
- 语法说明:
- 文档声明以符号
<?
开头,以?>
结束- 声明中间必须声明版本信息,可以声明编码信息以及文档独立性信息
- 注意:<和?之间,?和>之间以及第一个?和xml之间不能有空格;xml需要小写
- 例:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
- 语法说明:
- version:声明XML的版本
- encoding:声明XML文档所使用的编码方式,默认使用UTF-8
- standalone:声明文档是否是独立文档,默认为no,表示文档依赖于外部文档
- 2.元素(标记)定义
- XML文档中主体内容都是由元素(Element)/标记 组成
- 元素一般是由开始标记,属性,元素内容(文本),结束标记构成
<售价 [单位="元"]>80</售价>
- 语法说明:
- <售价></售价>即为XML文档中的标记,标记的名称即为元素的名称
- 一个元素中可以嵌套若干子元素,但必须合理嵌套
- XML标记不能以数字或下划线开头,也不能以xml或XML开头
- XML标记中不能包含空格,分号等特殊符号
- 根元素: 如果一个元素没有嵌套在其他元素内,则该元素为根元素;根元素是XML文档定义的第一个元素
- 空元素: 如果一个元素中没有嵌套子元素,也没有包含文本内容,则该元素为空元素;空元素可以不使用结束标记,但必须在起始标记的>前增加一个正斜杠/来说明该元素是个空元素(例:
<img></img>简写为<img/>
)- 3.属性定义
- XML文档中,可为元素定义属性
- 属性是对元素的进一步描述和说明
- 一个元素中,可以有多个属性,且每个属性都有自己的属性名和属性值
- 语法说明:
- <售价>元素中定义了一个属性,属性名为单位,属性值为元
- XML文档中,属性的命名规范和元素相同,属性值必须要用双引号或单引号引起来,否则被视为错误
- 属性与属性之间用空格隔开
- 4.注释
- 注释的内容会被程序忽略而不被解析和处理
- XML和HTML注释写法基本一致
- 语法格式:
<!-- 注释信息 -->
3.XML约束和XML约束语言
- 编写XML文档时,其内容必须满足某些条件的限制,为此在XML文档中定义了一套规则对文档中的内容进行约束,这套约束称为XML约束
- 对XML文档进行约束时,同样需要遵守一定的语法规则,这种语法规则形成了XML约束语言,常用的两种约束语言是
- 1.DTD约束
- 2.Schema约束
4.DTD约束
- DTD是一种XML约束模式语言,根据它的语法创建的文件称为DTD文件,后缀为.dtd
- DTD文件中,可以包含元素的定义,元素之间关系的定义,元素属性的定义,实体和符号的定义
- book.xml
<?xml version="1.0" encoding="utf-8" standalone="no"?> <!DOCTYPE 书架 SYSTEM "book.dtd"> <书架> <书> <书名>JAVA</书名> <作者>黑马程序员</作者> <售价>48</售价> </书> <书> <书名>JAVAWEB</书名> <作者>黑马程序员</作者> <售价>58</售价> </书> </书架>
- book.dtd
<!ELEMENT 书架 (书+)> <!ELEMENT 书 (书名,作者,售价)> <!ELEMENT 书名 (#PCDATA)> <!ELEMENT 作者 (#PCDATA)> <!ELEMENT 售价 (#PCDATA)>
- 语法说明:
- XML文档中的每个元素都是按照DTD文档所规定的约束进行编写
- 第1行<!ELEMENT 书架 (书+)>定义了一个元素,书架是元素的名称,(书+)表示书架中有一个或多个书元素;字符+修饰的成分必须出现一次或多次
- 第2行<!ELEMENT 书 (书名,作者,售价)>定义了一个元素,书是元素的名称,(书名,作者,售价)表示元素书包含书名,作者,售价这3个子元素,并且这些子元素按照顺序依次出现
- 第3~5行书名,作者,售价都是元素名称,(#PCDATA)表示元素中嵌套的内容是普通的文本字符串
1.DTD引入方式
1.在xml文档中直接嵌入DTD文件
- 语法格式:
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <!DOCTYPE 根元素名 [ DTD定义语言 ]> XML定义语言
- 例:
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <!DOCTYPE 书架 [ <!ELEMENT 书架 (书+)> <!ELEMENT 书 (书名,作者,售价)> <!ELEMENT 书名 (#PCDATA)> <!ELEMENT 作者 (#PCDATA)> <!ELEMENT 售价 (#PCDATA)> ]> <书架> <书> <书名>JAVA</书名> <作者>黑马程序员</作者> <售价>48</售价> </书> <书> <书名>JAVAWEB</书名> <作者>黑马程序员</作者> <售价>68</售价> </书> </书架>
2.在xml文档中引用本地的DTD文件
- 语法格式:
<?xml version="1.0" encoding="utf-8" standalone="no"?> <!DOCTYPE 根元素名 SYSTEM "外部DTD文件URI"> XML定义语言
- 例:
<?xml version="1.0" encoding="utf-8" standalone="no"?> <!DOCTYPE 书架 SYSTEM "book.dtd"> <书架> <书> <书名>JAVA</书名> <作者>黑马程序员</作者> <售价>48</售价> </书> <书> <书名>JAVAWEB</书名> <作者>黑马程序员</作者> <售价>58</售价> </书> </书架>
> <!ELEMENT 书架 (书+)> <!ELEMENT 书 (书名,作者,售价)> <!ELEMENT 书名 (#PCDATA)> <!ELEMENT 作者 (#PCDATA)> <!ELEMENT 售价 (#PCDATA)>
- 语法说明:
- 外部DTD文件的URI:指DTD文件的存放位置,可以是相对于XML文档的相对路径,也可以是绝对路径
- 由于引入的是本地的DTD文件,因此使用的是SYSTEM属性的DOCTYPE声明语句
- 在XML文档的声明语句中,standalone属性不能设置为yes
3.在xml文档中引用公共的DTD文件
- 语法格式:
<?xml version="1.0" encoding="utf-8" standalone="no"?> <!DOCTYPE 根元素名 PUBLIC "DTD名称" "外部DTD文件URI"> XML定义语言
- 语法说明:
- 外部DTD文件的URI:它是Internet上的一个绝对URL路径
- 由于引入的是公共的DTD文件,则需要在DOCTYPE声明语句中使用PUBLIC属性
- DTD名称:用于对DTD符合非标准,所有者的名称以及DTD描述的文件进行说明
- 在XML文档的声明语句中,standalone属性不能设置为yes
2.DTD语法
1.元素定义
- 元素是XML文档的基本组成部分,在DTD定义中,每一条<!ELEMENT…>语句用于定义一个元素
- 语法格式:
<!ELEMENT 元素名称 元素内容>
- 语法说明:
- 元素名称:它是自定义的名称,用于定义被约束XML文档中的元素
- 元素内容:是对元素包含内容的声明,包括数据类型和符号两部分
- 1.数据类型
- 1.#PCDATA:表示该元素中嵌套的内容是普通文本字符串
- 2.子元素:表示该元素包含的子元素,通常用一对圆括号()将元素中要嵌套的一组子元素括起来
- 3.混合内容:表示该元素可以包含字符数据,也可以包含子元素,混合内容必须被定义零个或多个
- 4.EMPTY:表示该元素既不包含字符数据,也不包含子元素,是一个空元素(可以包含属性);如果在文档中元素本身已经表明了明确的含义,就可以在DTD中用关键字EMPTY表明空元素
- 5.ANY:表示该元素可以包含任何字符数据和子元素
- 2.符号
- 1.问号[?]:表示该对象可以出现0次或1次
- 2.星号[*]:表示该对象可以出现0次或多次
- 3.加号[+]:表示该对象可以出现1次或多次
- 4.竖线[|]:表示在列出的对象中选择1个
- 5.逗号[,]:表示对象必须按照指定的顺序出现
- 6.括号[()]:用于给元素进行分组
2.属性定义
- 语法格式:
<!ATTLIST 元素名 属性名1 属性类型 设置说明 属性名2 属性类型 设置说明 。。。 >
- 语法说明:
- 元素名:指属性所属元素的名字
- 属性名:指属性的名称
- 属性类型:指定该属性是属于哪种类型
- 设置说明:指说明该属性是否必须出现
- 1.属性类型
- DTD定义元素属性时,有10种属性类型可以选择
- 1.CDATA:
- 表示属性类型是字符数据
- 属性设置值中的特殊字符,需要使用转义字符序列表示
- 2.Enumerated:
- 表示属性类型是枚举类型,可以限制属性的取值只能从一个列表中选择
- 注意在DTD定义中并不会出现关键字Enumerated
- 3.ID:
- 一个ID类型的属性用于唯一标识XML文档的一个元素,其属性值必须遵守XML名称定义的规则
- 一个元素只能有一个ID类型的属性,而且ID类型的属性必须设置为#IMPLIED或REQUIRED
- ID类型属性的每一个取值都用来标识一个特定的元素,为ID类型的属性提供默认值或固定的默认值毫无意义
- 4.IDREF和IDREFS:
- IDREF类型可以使两个元素之间建立一对一的关系,且IDREF类型属性的值必须为一个已经存在的ID类型的属性值
- IDREFS类型可以是两个元素之间建立一对多的关系,IDREFS类型的属性可以引用多个ID类型的属性值,这些ID的属性值需要用空格分割
- 2.设置说明
- 定义元素的属性时,有4中设置说明可以选择
设置说明 含义 #REQUIRE 表示该属性时必须的 #IMPLIED 表示该属性可以包含该属性,也可以不包含该属性 #FIXED 表示一个固定的属性默认值,在XML文档中不能将该属性设置为其他值;使用FIXED关键字时,该需要为该属性提供一个默认值;当XML文档中没有定义该属性时,其值将被自动设置为DTD中定义的默认值 默认值 如果元素不包含该属性,该属性将自动设置为DTD中定义的默认值;该值可以改变,如果XML文件中设置了该属性,新的属性值会覆盖DTD中定义的默认值,而FIXED则不会
5.Schema约束
- Schema是一种用于定义和描述XML文档结构与内容的模式语言
- Schema和DTD的区别:
- 1.DTD采用的是非XML语法格式,文件后缀名为.dtd;Schema采用的是XML语法格式且它本身也是一种XML文档,文件后缀名是.xsd
- 2.DTD本身合法性的验证采用另一套机制;Schema采用与XML文档相同的合法性验证机制
- 3.Schema支持名称空间;DTD不支持名称空间
- 4.DTD支持的数据类型有限;Schema支持的数据类型更多,包括自定义的数据类型
- 5.DTD定义约束能力有限,无法对XML实例文档作出更细致的语义限制;Schaema定义约束能力强大,可以对XML实例文档作出细致的语义限制
1.Schema名称空间
- 一个XML文档中可以引入多个约束文档,为了防止约束文档中出现不同含义的同名元素和属性导致名称冲突,可以使用名称空间
- 它可以唯一标识一个元素或属性
2.Schema引入方式
3.Schema语法
- 1.元素定义
- 语法格式:
<xs:element name="xxx" type="yyy">
- 语法说明:
- element:用于声明一个元素,xxx指元素的名称,yyy指元素的数据类型
- Schema中有内建的数据类型
- 1.xs:string:
- 2.xs:decimal:表示小数类型
- 3.xs:integer:表示整数类型
- 4.xs:boolean:表示布尔类型
- 5.xs:date:表示日期类型
- 6.xs:time:表示时间类型
- 2.属性定义
- 语法格式:
<xs:attribute name="xxx" type="yyy">
- 语法说明:
- attribute:用于声明一个属性,xxx指属性的名称,yyy指属性的数据类型
- 属性的数据类型和素的数据类型一致,都使用Schema中内建的数据类型
- 3.简单类型
- Schema文档中只包含字符数据的元素都是简单类型
- 简单类型使用xs:simpleType元素定义
- 对现有元素内容的类型进行限制,使用xs:restriction元素定义
- 元素内容的类型限制的方式:
- 1.xs:minlnclusive和xs:maxlnclusive元素对值的限定
- 2.xs:enumeration元素对一组值的限定
- 3.xs:pattern元素对一系列值的限定
- 4.xs:whiteSpace元素对空白字符的限定
- 4.复杂类型
- Schema文档中除简单类型外都是复杂类型
- 复杂类型使用xs:complex-Content元素定义
- 复杂类型的元素可以包含子元素和属性,这样的元素称为复合元素
- 复合元素定义时,如果元素的开始标记和结束标记之间只包含字符数据内容则为简易内容,需要使用xs:simpleContent元素定义;反之则为复杂内容,需要使用xs:compleContent元素定义
- 复合元素有4中基本类型
- 1.空元素
- 2.包含其他元素的元素
- 3.仅包含文本的元素
- 4.包含元素和文本的元素