Web开发的配置技术-XML
为了方便markdown文档描述,本章< xx >这种形式的描述均加空格,需要复制请去掉空格
XML概述
XML全称为Extensible Markup Language, 意思是可扩展的标记语言,它是 SGML(标准通用标记语言)的一个子集。而HTML(HyperText Mackeup Language)为超文本标记语言
XML语法上与HTML相似,但HTML中的元素是固定的,XML的标签是一颗由用户自定义的
本章学习的XML版本为标准的1.0版本
XML的作用
- 程序的配置文件
- 数据交换,不同语言之间用来交换数据
- 小型数据库,用来当数据库使用
XML与HTML比较
- HTML 元素是固定的,XML可以自定义元素‘
- HTML用浏览器解析执行,XML的解析器通常需要自己来写(因为元素是自定义的)
- HTML只能用来表示网页,XML可以做的事情很多
XML与properties(属性文件)的比较
- 属性文件只能存储平面信息,而XML可以存储结构化信息
- 解析属性文件只需要用properties类就可以了,解析XML文档是相对复杂的
XML语法
- 元素
- 文档声明
XML文档展示:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<students>
<student number="1001">
<name>zhangSan</name>
<age>23</age>
<sex>male</sex>
</student>
<student number="1002">
<name>liSi</name>
<age>32</age>
<sex>female</sex>
</student>
<student number="1003">
<name>wangWu</name>
<age>55</age>
<sex>male</sex>
</student>
</students>
XML文档组成部分:
- XML文档声明
- XML处理指令
- XML元素
- XML特殊字符与CDATA区
- XML注释
XML文档声明
概述:
可以把XML文档声明看成是XML文档说明
最简单的XML文档声明:<?xml version=“1.0”>
注意:XML区分大小写
XML文档声明结构:
-
version属性:用于说明当前XML文档的版本,默认使用1.0,version属性是必须的
-
encoding属性:说明当前XML文档使用的字符编码集,XML解析器会使用这个编码来解析XML文档,encoding属性是可选的,默认utf-8(注意:如果当前xml文档使用的字符编码集是gb2312,而encoding属性的值为UTF-8,那么一定会出错的)
-
standalone属性:用于说明当前XML文档是否独立文档(yes/no),若XML文档不是独立的,即依赖外部的约束文件,默认yes
-
没有声明的XML文档,不是格式良好的XML文档
-
xml文档声明必须从xml文档的1行1列开始
XML元素
格式一:
XML元素包含:开始标签、元素体(内容)、结束标签 例如:<hello>大家好</hello>
空元素:空元素只有开始标签,没有元素体和结束标签,但空元素一定要闭合。例如:
格式二:
-
xml元素可以包含子元素或文本数据。例如:
<a><b>hello</b></a>
,a元素的元素体内容是b元素,而b元素的元素体内容是文本数据hello -
xml元素可以嵌套,但必须是合法嵌套
根元素:
比较以下两端XML代码:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<students>
<student number="1001">
<name>zhangSan</name>
<age>23</age>
<sex>male</sex>
</student>
<student number="1002">
<name>liSi</name>
<age>32</age>
<sex>female</sex>
</student>
</students>
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<student number="1001">
<name>zhangSan</name>
<age>23</age>
<sex>male</sex>
</student>
<student number="1002">
<name>liSi</name>
<age>32</age>
<sex>female</sex>
</student>
针对student的存储来说:
student1.xml是格式良好的xml文档,只有一个根元素,即students元素。
student2.xml不是格式良好的xml文档,有两个根元素,即两个student根元素。
空白
注意:编写XML元素时,出现空白,在解析XML程序时,可能会出现异常,如
<a>
<b>
hello
</b>
</a>
命名规范
xml元素名可以包含字母、数字以及一些其它可见字符,但必须遵循下面的一些规范:
- 区分大小写:
<a>和<A>
是两个元素; - 不能以数字开头:
<1a>都
是错误的; - 最好不要以xml开头:
<xml>、<Xml>、<XML>
; - 不能包含空格;
元素属性
- 属性由属性名与属性值构成,中间用等号连接;
- 属性值必须使用引号括起来,单引或双引;
- 定义属性必须遵循与标签名相同的命名规范;
- 属性必须定义在元素的开始标签中;
- 一个元素中不能包含相同的属性名;
注释
<!-- -->
-
注释以<!--开头,以-->结束;
-
注释中不能包含–;
转义
因为在xml文档中有些字符是特殊的,不能使用它们作为文本数据。例如:不能使用“<”或“>”等字符作为文本数据,所以需要使用转义字符来表示。
例如<a><a></a>
,你可能会说,其中第二个< a >是a元素的文本内容,而不是一个元素的开始标签,但XML解析器是不会明白你的意思的。
把<a><a></a>
修饰为
<a><a></a>
就行
转义字符都是以“&”开头,以“;”结束。这与后面我们学习的实体是相同的
CDATA区(CDATA段)
当大量的转义字符出现在xml文档中时,会使xml文档的可读性大幅度降低,这时如果使用CDATA段就会好一些
<a><![CDATA[<a>]]></a>
在CDATA段中不能包含“]]>”,即CDATA段的结束定界符
XML约束
因为XML文档是可以自定义元素的,这会让使用XML文档的应用程序无法知道XML文档的真实结构。通常应用程序都会要求XML文件的结构是固定的,以满足自己的需求,这就说明,不同的应用程序要求自己的XML文档必须符合一定的要求
XML文档约束是用另一个文件来约束XML文档的结构,例如要求XML文档的根元素必须是< students >,在< students >元素下可以包含0~n个< student >元素,每个< student >元素必须有一个number属性,而且还要有三个子元素,分别为< name >、< age >、< sex >,这三个子元素的内容必须为文本内容,而不能是子元素
DTD约束
dtd是平面式文档,dtd文件不是xml文档,通常扩展名为“.dtd”。它是最早的xml约束
例如要求xml文档的根元素必须是< students >,在< students >元素下可以包含0~n个< student >元素,每个< student >元素必须有一个number属性,而且还要有三个子元素,分别为< name >、< age >、< sex >,这三个子元素的内容必须为文本内容,而不能是子元素
<!ELEMENT students (student+)>
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
指定DTD文件
在XML文档中指定DTD约束文件
<?xml version="1.0" encoding="utf-8" standalone="no" ?>
<!DOCTYPE students SYSTEM "students.dtd">
<students>
<student>
<name>zhangSan</name>
<age>23</age>
<sex>male</sex>
</student>
</students>
其中< !DOCTYPE students SYSTEM "students.dtd" >
,表示指定dtd文件
指定DTD的语法:< !DOCTYPE 根元素 SYSTEM “DTD文件路径”>
SYSTEM表示dtd文件在本地
在XML文档中指定内部DTD约束:
<?xml version="1.0" encoding="utf-8" standalone="no" ?>
<!DOCTYPE students [
<!ELEMENT students (student+)>
<!ELEMENT student (name, age, sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
]>
<students>
<student>
<name>zhangSan</name>
<age>23</age>
<sex>male</sex>
</student>
</students>
在XML文档中指定外部公共DTD约束:
<?xml version="1.0" encoding="utf-8" standalone="no" ?>
<!DOCTYPE students PUBLIC "-//rlteach//DTD ST 1.0//ZH" "http://www.rlteach.com/xml/dtds/st.dtd">
<students>
<student>
<name>zhangSan</name>
<age>23</age>
<sex>male</sex>
</student>
</students>
外部公共DTD是说,DTD由某个公司或权威组织发布,如下:
< !DOCTYPE 根元素 PUBLIC "DTD名称" "DTD网址">
当然你需要知道要使用的DTD的名称和网址。如果某个机构公布了DTD,那么一定也会公布DTD的名称和网址
DTD常见约束解析:
-
< !ELEMENT stu ANY>
:表示stu元素的内容可以是任意元素,也可以是文本数据,也可以是文本数据+子元素,反正就是任意。 -
< !ELEMENT stu EMPTY>
:表示stu不能有任何内容,即空元素。例如:< stu/>
。 -
< !ELEMENT stu (#PCDATA)>
表示stu元素内容为文本,例如:< stu>hello</stu>
-
< !ELEMENT stu (name)>
表示stu元素内容为name子元素,例如< stu>< name>< /name>< stu>
,但要注意,如果< name>元素没有声明,那么就会出错 -
< !ELEMENT stu (name?)>
表示stu元素可以有0~1个name子元素,即name子元素可有可无 -
< !ELEMENT stu(name*)>
表示stu元素可以有0~n个name子元素 -
< !ELEMENT stu(name+)>
表示stu元素可以有1~n个name子元素 -
< !ELEMENT stu (name,age,sex)>
表示stu必须有三个子元素,分别是name、age、sex,并且子元素出现的顺序也要与声明的顺序一致 -
<!ELEMENT stu (name | age | sex)
表示stu只有一个子元素,可以是name、age、sex中的任意一个 -
< !ELEMENT stu (name | age | sex)?>
表示stu元素可以有0~1个(name | age | sex),而**(name | age | sex)表示name、age、sex其中的一个** -
< !ELEMENT stu (name | age | sex)*>
表示stu元素可以有0~n个(name | age | sex),而(name | age | sex)表示name、age、sex其中的一个 -
< !ELEMENT stu (name | age | sex)+>
表示stu元素可以有1~n个(name | age | sex),而(name | age | sex)表示name、age、sex其中的一个
DTD属性定义
格式
attribute List
<!ATTLIST 元素名 属性名1 属性类型 设置说明 属性名2 属性类型 设置说明 ...>< !ATTLIST student number CDATA #REQUIRED>表示student元素的number为属性名,CDATA文本类型,这个属性是必须的。
最常见的属性类型:CDATA,表示文本类型;
最常见的设置说明1**:#REQUIRED,表示属性是必须的**。
最常见的设置说明2:#IMPLIED,表示属性是可选的
类型
-
CDATA:属性值为任意文本数据;
-
Enumerated:属性值必须是枚举列表中的一个;
-
ID:属性值必须是唯一的,并且属性值不能以数字开头
CDATA
CDATA,即Character Data(字符数据)。表示属性的类型为字符类型!
< !ATTLIST student number CDATA #REQUIRED>
表示student元素的number属性是字符数据类型,并且是必须属性。
< student number="czbk_1001">
Enumerated
Enumerated不是关键字,定义枚举类型的属性需要给出枚举列表。当属性值为枚举类型时,那么这个属性的取值必须是枚举列表中的一个值
< !ATTLIST student sex (male | female) #IMPLIED>
表示student的sex属性取值必须是male或者是female。并且这个属性是可选的
ID属性类型
一个元素最多只能有一个ID 属性,ID属性用来表示元素唯一性的唯一标识。ID属性就相当与元素的身份证号,必须是唯一标识
果把student元素的number属性设定为ID类型,那么每个student元素的number属性值必须是唯一的,并且ID类型的属性值不能以数字开头
< !ATTLIST student number ID #REQUIRED>
表示student的number属性值是ID类型,这说明student元素的number属性值必须是唯一的,不能和其他student的number属性值相同
<student number=”czbk_1001”/>
<student number=”czbk_1002”/>
如果< a>元素有一个ID属性a
如果< b>元素有一个ID属性b
<a a="abc"/>
<b b="abc"/>
上面也是错误的,因为ID属性的值是不可以相同的
Schema约束
我们学习Schema的第一目标是:参照Schema的要求可以编写XML文档;
第二目标是:可以自己来定义Schema文档
DTD的局限性
-
DTD不遵守XML语法(写XML文档实例时候用一种语法,写DTD的时候用另外一种语法)
-
DTD数据类型有限(与数据库数据类型不一致)
-
DTD不可扩展
-
DTD不支持命名空间(命名冲突)
Schema的新特性
-
Schema基于XML语法
-
Schema可以用能处理XML文档的工具处理
-
Schema大大扩充了数据类型,可以自定义数据类型
-
Schema支持元素的继承—Object-Oriented’
-
Schema支持属性组
Schema文档结构
Schema数据类型
Schema的数据类型与数据库的数据类型对应得很好
基本数据类型
扩展数据类型
数据类型的特性
用户自定义数据类型
通过simpleType定义
Schema元素
作用:包含已经定义的schema
用法:<xs:schema>:
xs是命名空间的别名,也可以自定义,但是建议使用默认的。
属性:
xmlns:约束当前xml的命名空间(必有的)
targetNamespace:文件名一样,则引入的scema约束以targetnamespace作区分
schema代码:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"
targetNamespace="http://java.cn"
>
<xs:element name="book">
<xs:complexType>
<xs:sequence>
<xs:element name="bookName" type="xs:string"></xs:element>
<xs:element name="author" type="xs:string"></xs:element>
<xs:element name="price" type="xs:float"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
XML代码:
<?xml version="1.0" encoding="UTF-8"?>
<book xmlns="http://txjava.cn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://txjava.cn demo2.xsd">
<bookName>神雕侠侣</bookName>
<author>金庸</author>
<price>25.4</price>
</book>
- xsi:schemaLocation:引用的命名空间+“ ”约束文件的全地址
引用schema的语法如下
<根结点 xmlns=”要引入的schema的命名空间”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=”命名空间 约束文件的位置” >
element元素
作用:
声明一个元素
属性:
-
Name:元素的名称
-
Type:元素的类型
-
ref:引用已定义的元素
-
minOccurs :至少出现的次数
-
maxOccurs :最多出现的次数
-
fixed:元素的值固定成指定值
-
default:默认值
<xs:element name="dog" type="xs:string" fixed="旺财"></xs:element>
只要是狗->都叫旺财
<xs:element name="cat" type="xs:string" default="咪咪"></xs:element>
只要是猫->都叫咪咪
Attribute元素
作用:
声明一个属性
属性:
-
Name:属性名
-
Type:属性类型
-
ref:外部属性的引用
-
use:是否是必填
示例:
<xs:attribute name="studno" type="xs:int" use="required"></xs:attribute>
attributeGroup组属性元素
<xs:element name="student">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"></xs:element>
<xs:element name="age" type="xs:int"></xs:element>
<xs:element name="gender" type="xs:string"></xs:element>
</xs:sequence>
<xs:attributeGroup ref="studattr"></xs:attributeGroup>
</xs:complexType>
</xs:element>
<xs:attributeGroup name="studattr">
<xs:attribute name="studno" type="xs:int" use="required"></xs:attribute>
<xs:attribute name="score" type="xs:int" use="required"></xs:attribute>
</xs:attributeGroup>
SimpleType元素
作用:
- 定义一个简单类型(type),它决定了元素和属性值的约束和相关信息
属性:
- name:自定义属性的类型
内容:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="student">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"></xs:element>
<xs:element name="age" type="xs:int"></xs:element>
<xs:element name="gender" type="genderst"></xs:element>
<xs:element name="favor" type="favorst"></xs:element>
</xs:sequence>
<xs:attributeGroup ref="studattr"></xs:attributeGroup>
</xs:complexType>
</xs:element>
<xs:attributeGroup name="studattr">
<xs:attribute name="studno" type="xs:int" use="required"></xs:attribute>
<xs:attribute name="score" type="scorest" use="required"></xs:attribute>
</xs:attributeGroup>
<!-- 0到100的数值约束 -->
<xs:simpleType name="scorest">
<xs:restriction base="xs:int">
<xs:minInclusive value="0"></xs:minInclusive>
<xs:maxInclusive value="100"></xs:maxInclusive>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="genderst">
<xs:restriction base="xs:string">
<xs:enumeration value="男"></xs:enumeration>
<xs:enumeration value="女"></xs:enumeration>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="favorst">
<xs:list itemType="xs:string"></xs:list>
</xs:simpleType>
</xs:schema>
- 子元素为< xs:restriction>定义一个约束条件
complexType
作用:
定义一个复合类型,它决定了一组元素和属性值的约束和相关信息
属性:
name
<xs:element name="student">
<!--复杂数据类型,用来表示元素和元素的层级关系或属性关系 -->
<xs:complexType>
<!--sequence 内部元素是有序的从上到下 -->
<xs:sequence minOccurs="1" maxOccurs="3">
<xs:element name="name" type="xs:string"></xs:element>
<xs:element name="gender" type="xs:string"></xs:element>
<xs:element name="age" type="xs:int"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
-
<xs:sequence > :内部元素是有序的从上到下
-
<xs:all >:内部元素是无序的
-
<xs:choice >:只能出现定义的一个元素
simpleType与complexType的区别
- simpleType类型的元素中不能包含元素或者属性
- 当需要声明一个元素的子元素或属性时,用conplexType
- 当需要基于内置的基本数据类型定义一个新的数据类型时,用simpleType