XML基础
XML基础
XML概述
什么是XML
XML是EXtensible Markup Language的缩写,他是一种类似于HTML的标记语言,称为可扩展标记语言。所谓扩展,指的是用户可以按照XML规则自定义标记。
XML和HTML比较
XML和HTML都是标记文本,他们在结构上大致相同,都是以标记的形式来描述信息。接下来度HTML和XML进行比较:
(1)HTML中标记是用来显示数据的,而XML中标记是用来描述数据的性质和结构。
(2)HTML是不区分大小写的,XML是严格区分大小写的
(3)HTML可以有多个根元素,而XML是有且只能有一个根元素。
(4)HTML中,属性值括号是可用可不用的,而XML中属性值必须在引号中。
(5)HTML中空格是自动过滤的,XML中空格是保留的。
(6)HTML中标记是预定义的,而XML中标记是可以随便定义的,并且可以扩展。
XML语法
文档声明
在一个完整的XML文档中,必须包含一个XML文档的声明,并且该声明必须位于文档的第一行。XML文档声明的语法格式为
<? xml 版本信息[编码信息][文档独立性信息]?>
版本声明
由于解析器对不同版本的XML的文档解析方式不同,因此在文档声明时,必须指定版本信息,示例:
<?xml version="1.0"?>
在上述版本中,version属性表示XML的版本。
文档编码声明
由于人们可以使用不同的字符集编码来书写一个字符内容完全相同的XML文档,所以XML编码软件必须知道XML文档所使用的的编码方式。默认情况下XML文档编码方式使用的是utf-8编码格式。XML中encoding属性来说明编码格式。
独立文档声明
如果我们文档不利来外部文档,在XML文档中可以通过standalone="yes"来声明这个文档是独立的文档。如果文档依赖于外部文档,可以通过standalone="no"来声明,默认情况下standalone的属性值为no。
示例:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<书架>
<书>
<书名>java就业培训教程</书名>
<作者>123</作者>
<售价>11.0元</售价>
</书>
</书架>
元素定义
在XML文档中,主体内容都是由元素组成的,元素一般是由开始标记、属性、元素内容和结束标记构成,具体是例如下:
<城市>北京</城市>
在上述示例中,“<城市>”就是标记,标记名称就是元素名称。在一个元素中可以嵌套若干子元素。
在XML文档中,元素名称可以包含字母、数字和其他可见的字符,但是命名XML元素时,应该遵守以下规范:
(1)区分大小写。
(2)元素名称中,不能包含空格、冒号、分号、逗号和尖括号,元素名称不能以数字开头
(3)建议不要使用减号,而是使用下划线替代,以免与表达式中减号运算符混淆。
(4)建议不要使用“.”,因为在许多程序语言中,“.”用于运用对象的属性。
(5)建议名称不要以字符组合XML开头
(6)建议名称的大小尽量采用同一标准,要么全部大写,要么全部小写。
(7)名称可以使用非英文字符,但是有些软件可能不支持非英文字符意外的字符。
属性定义
在XML文档中,可以为元素定义属性,属性是对元素的进一步描述和说明。在一个元素中刻已有多个属性,并且没个属性都有自己的名称和取值,具体实例如下:
<售价 单位=“元”>68</售价>
在XML文档中,属性的命名规范同元素相同,属性值必须要有双引号和单引号引起来,否则视为错误。
注释
XML注释和HTML注释写法基本一致,具体语法格式如下:
<!--注释信息-->
注意:
(1)注释不能出现在XML声明之前,XML文档声明必须是文档的第一行。
(2)注释不能出现在标记中。
(3)字符串“–”不能在注释中出现。
(4)在XML中,不允许注释以“–>”结尾。
(5)注释不能嵌套使用。
特殊字符处理
在XML文档中,有些字符具有特殊的意义,解析器它时不会将其当做一般字符按照其原始意义进行处理,例如<123>会被看作是一个元素而不是数字。为解决这个问题XML提供了转义字符。
特殊字符 | 预定义字体 |
---|---|
& | & |
< | < |
> | > |
" | " |
’ | &apos |
列举了预定义实体在XML文档中替代字符。
CDATA区
CDATA区指的是不想被程序解析的一段原始数据,它以“<![CDATA["开始,以"]]>”。当一个XML文档中包含Java代码,代码中包含多个小于号、大于号等特殊字符时,如果逐个字符去转换,显然是非常麻烦的。这时这段代码放在CDATA区中
DTD约束
什么是约束
在XML文档中,定义了一套规则,对文档中的内容进行约束,这套约束称为这套约束称为XML约束,对XML文档进行约束时,同样需要遵守一定的语法规则,这种约束同样需要遵守一定的语法规则,这种语法规则形成了XML约束语言,,目前最常用的约束语言就是DTD约束和Schema约束。
DTD约束
根据DTD语法创建的文件称为DTD文档,在DTD文件中可以包含元素的定义,元素之间关系的定义,元素属性的定义以及实体和符号的定义。
如果使用DTD文件约束XML文档,必须在XML文档中引入DTD文件,在XML文档中引入DTD文件有两种形式。
<!DOCTYPE 根元素名称 SYSTEM “外部DTD文件的URL”>
<!DOCTYPE 根元素名称 PUBLIC "DTD名称" “外部DTD文件的URL”>
上述两种DTD引入方式,第一种方式是用来引入本地的DTD文件,第二种是用来引入公共的DTD文件,其中“外部DTD文件的URL”是指DTD文件的存放路径,对于第一种方式,它可以是绝对路径也可以是相对路径,对于第二种方式,它也可以是一个网址。
DTD对XML文档的约束除了外部引入也可以采用内嵌的方式,不过大部分的DTD 文件还是采用外部引入的方式,外部引入方便管理和维护DTD定义,还可以使多个XML文档共同使用一个DTD文件。
DTD语法
元素定义
元素是XML文档的基本组成部分,在DTD定义中,每一条<!ELEMENT…>语句,用于定义一个元素,其基本语法格式如下所示:
<!ELEMENT 元素名称 元素内容>
其中元素名称是被约束的XML文档中的元素,元素内容包含内容的声明,包括数据类型和符号两部分,一共有五种内容形式:
(1)#PCDATA:表示元素中嵌套内容是普通的文本字符串。
(2)子元素:说明元素中包含的元素,通常以一对括号,将元素的子元素括起来。
(3)混合内容:表示元素既可以包含字符数据,也可以包含子元素。混合内容必须被定义为0个或多个。
(4)ANY:表示该元素可以包含任何字符数据和子元素。
(5)EMPTY:表示钙元素既不包括字符数据,也不包含子元素,是一个空元素。
元素内容中也可以包含一些符号,不同的符号具有不同的作用。
(1)问号[?]:表示该对象可以出现0次或1次
(2)星号[*]:表示该对象可以出现0次或多次
(3)加号[+]:表示该对象可以出现1次或多次
(4)竖线[|]:表示在列出的对象中选一个
(5)逗号[,]:表示对象必须按照指定的顺序出现
(6)括号[()]:用于给元素进行分组
属性定义
在DTD文档中既可以定义元素还可以给元素定义属性。格式如下:
<!ATTLIST 元素名
属性1 属性类型 设置说明
属性2 属性类型 设置说明
>
元素名是属性所属的元素的名字,属性名是属性的名称。
设置说明用来说明该属性是否必须出现,在定义元素的属性时,有4中设置说明可以选择:
(1)#REQUIRED表示元素的该属性是必需的。
(2)#IMPLIED表示元素既可以包含该属性,也可以不包含该属性
(3)#FIXED表示一个固定的属性默认值,在XML文档中不能将该属性设置为其他值。
(4)默认值:和#FIXED一样,如果元素不包含该属性,该属性将自动设置为DTD中定义的默认值。
属性类型在DTD中定义属性时,有10种属性类型可以选择。
(1)CDATA
这是最常用的一种属性类型,表明属性类型是字符数据,与元素内容说明的#PCDATA相同。
(2)Enummerated
在声明属性是可以限制属性的取值,只能从一个列表中选择,这类属性属于Enumerated(枚举类型)。
示例:
(3)ID
一个ID类型的属性规则用于唯一标识XML文档中的一个元素,其属性值必须遵守XML文档定义的规则,一个元素只能有一个ID类型的属性,而且ID类型的属性都必须设置为#IMPLIED或#REQUIRED。
(4)IDREF和IDREFS
IDREF类型可以是两个元素之间建立一对一关系,IDREFS类型可以是两个元素之间的关系是一对多。
IDREF类型属性的值为一个已经存在的ID类型属性值。IDREFS类型可以引用多个ID类型的属性值,这些ID的属性值需要用ID空格分隔。
(5)NMTOKEN和NMTOKENS
NMTOKEN是Name Token的简写,它表示由一个或者多个字母、数字、句点、连子号(-)或下划线(_)所组成的一个名称,NMTOKENS关键字表示一种列表类型。一个元素的NMOTOKENSF类型的数据的属性设置值可以是同一个xml文件中另外多个NMTOKEN类型的属性值,每个NMTOKEN属性值之间用空格分隔。
(6)NOTATION
显示时间中存在许多无法或不易使用的xml格式组织的数据,如图像、声音、影像等。对于这些数据, xml不提供直接应用程序支持,但可以通过设置NOTATION类型的双属性来让一个外部应用程序进行处理,定义情况分为两种情况,具体如下:
第一种情况:<!NOTATION 符号名 SYSTEM "MINE类型">
第二种情况:<!NOTATION 符号名 SYSTEM "URL路径名">
在上述定义中,第一种情况指定数据的MINE类型,第二种情况指定处理程序的所在位置。
(7)ENTITY和ENTITYS
当某个属性的类型定义为ENTITY时,表明其属性值必须为在DTD中使用<!ENTITYS…>语句定义的一个实体的引用,只有使用实体才可以作为ENTITY类型属性的设置值,参数实体不能用作ENTITY类型的属性的设置值。
ENTITYS关键字用于表示一种列表类型。
实体定义
(1)引用实体
引用实体的语法定义格式有两种
<!ENTITY 实体名称 "实体内容">
<!ENTITY 实体名称 SYSTEM "外部xml文档的URL">
引用实体用于解决XML文档中的内容重复问题,引用的格式为
&实体名称;
示例:
(2)参数实体
参数实体只能被DTD文件自己使用,语法格式为:
<!ENTITY % 实体名称 "实体内容">
引用参数实体的方式是:
&实体名称
Schema约束
什么是Schema约束
同DTD一样,XMLSchema也是一种定义和描述XML文档结构与内容的谋士语言,Schema出现克服了DTD的局限性。XML Schema与DTD比较,XML Schema具有以下的优点:
(1)DTD采用的是非XML格式,缺乏对文档结构、元素、数据等全面的描述,而Schema采用的是XML语法格式,而他本身也是一种XML文档,XML Schema语法格式比DTD更好理解。
(2)XML有非常高的合法性要求,DTD本身合法性的验证必须采用另外一套机制,而XMLSchema则采用与XML文档相同的合法性验证机制。
(3)Sschema对名称空间支持非常好,而DTD几乎不支持名称空间。
(4)DTD支持的数据非常有限,而Schema比DTD支持更多的数据类型,包括用户自定义的数据类型。
(5)DTD定义约束能力非常有限,无法对XML实例文档做出细致的语义限制,而Schema定义约束能力非常强大,可以对XML实例文档做出细致的语义限制。
名称空间
一个XML文档,可以引入多个约束文档,由于约束文档中的元素或属性,都是自定义的,因此在XML文档中,极有可能出现代表不同含义的同名元素或属性,导致发生冲突。为此在XML文档中,提供了命名空间,它可以唯一标识一个元素或属性。
在使用名称空间时必须声明命名空间,名称空间的声明就是在XML实例文档中为某个模式文档的名称空间指定一个临时的简写名称,它通过一系列的的保留属性来声明,这种属性的名字必须是以"xmlns"或者是以"xmlns:"作为前缀,它与其他属性一样,都可以通过直接或者使用默认的方式认出,名称空间声明的语法如下:
<元素名 xmlns:prefixname="URL">
在上述语法格式中,"元素名"指的是哪一个元素上声明名称空间,在这个元素上声明的名称空间适用于声明它的元素和属性,以及钙元素中嵌套的所有元素及其他属性。xmlns:指的是钙元素的属性名,它所对应的值是一个URL引用,用来标识该名称空间的名称。需要注意的是,如果两个URL并且其组成的字符完全相同,就可以认为它们标识的是同一个名称空间。
示例:
在声明名称空间时,有两个前缀是不允许使用的,它们是xmlns和xml。
默认命名空间:格式如下
<元素名 xmlns="URi">
URI所标识的是默认的名称空间。以这种方式声明的名称空间将作为其作用域内所有元素的默认名称空间。
引入Schema文档
使用名称空间引入XML Schema文档
在使用名称空间引入XML Schema文档时,需要通过属性xsi:schemaLocation来声明名称空间的文档,xsi:schemaLocation属性是在标准名称空间:“http://www.w3…org/2001/XMLSchema-instance”中定义的,在该属性包含两个URI,这两个URI之间用空白分隔,第一个URI是名称空间的名称,第二个是文档的位置。
示例:
注意,一个xml文档可以引入多个名称空间,这时可以在schemaLocation属性值包含多对名称空间与它们所对应的XML Schema文档所在的位置。
不使用名称空间引入XML Schema文档
在XML文档中引入XML Schema文档不仅可以通过xsi:schemaLocation,还可以通过xsi:noNamespaceSchemaLocation属性直接指定。
Schema语法
元素定义
元素定义格式如下:
<xs:element name="xxx" type="yyy">
其中xxx是指的是元素名称,yyy指的是数据类型。
常用数据类型有:
(1)xs:string:表示字符串类型
(2)xs:decimal:表示小数类型
(3)xs:integer:表示整数类型
(4)xs:boolean:表示布尔类型
(5)xs📅表示日期类型
(6)xs:time:表示时间类型
属性定义
属性定义的格式如下:
<xs:attribute name="xxx" type="yyy">
其中xxx指的是属性名称,yyy指的是属性类型。属性类型与元素类型相同
简单类型
只包含字符数据类如果型是简单类型,简单类型使用xs:simple Type来定义,如果需要对元素内容的类型进行定义,则需要使用,xs:restriction,下列有一些简单元素类型进行限定
(1)xs:minInsive和xs:maxInsive元素值进行限定
xs:minInsive规定最小值,xs:maxInsive规定最大值。
(2)xs:enumeration:元素对一组值进行限定
如果希望将XML限制为一组可以接受的值,可以使用枚举约束。
(3)xs:pattern元素对一系列值的限定
如果希望将XML元素内容限定为一系列可使用的数字或字母,可以使用模式约束。
(4)xs:restriction元素对空白字符的限定
在XML文档中,空白字符比较特殊,如果需要对空白字符进行处理,可以使用whiteSpace元素有三个属性值可以设定,分别是:preserve表示不对uansu中任何空白字符进行处理,replace表示一出所有空白的字符,collapse表示将所有空白字符缩减为一个单一字符。
复杂类型
除简单类型之外的都是复杂类型,在定义复杂类型时需要使用xs:complexContent元素来定义,复杂类型的元素可以包含子元素和类型,这种类型称为复合元素,在定义复合元素时如果元素的开始标记和结束标记之间只包含字符数据内容那么这种内容是简易内容,简易内容需要用使用xs:simpleContent来进行定义,反之都是复杂内容,需要使用xs:complexContent元素来定义。
(1)空元素
这个空元素指的是不包含内容,只包含属性的元素
例:
<product prodid="1345" />
此时空元素的定义方式如下:
<xs:element name="product">
<xs:complexType>
<xs:attribute name="prodid" type="xs:positiveInteger">
</xs:complexType>
</xs:element>
(2)包含其他元素的元素
XML文档中包含其他元素的代码:
<person>
<firstname>a</firstname>
<lastname>b</lastname>
</person>
在Schema中对应的代码是
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
(3)仅包含文本的元素
对于仅包含文本的符合元素,需要使用simpleContent元素来添加应用,在使用简易内容时,必须在simpleComtent元素内定义扩展或限定。
(4)包含元素和文本的元素
在xml文档中,某些元素京城需要包含文本以及其他元素,例如:
<letter>
Dear Mr.<name>John</name>
you order<orderid>1032</orderid>
will be shipped on<shipdate>2001-07-13</shipdate>
</letter>
在Schema中定义为
<xs:element name="letter">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="orderid" type="xs:postitiveInteger"/>
<xs:element name="shipdate" type="xs:date"/>
</xs:sequence>
</xs:complexType>
</xs:element>