目录
1. 简易类型 SimpleType & 限定 Restriction
XML 概述
- 全称 EXtensible Markup Language 可扩展标记语言。
- XML 最初的设计师替代 HTML,因为 HTML 网页已经大量运行在网络中,难以替代,HTML4 停止更新后,更新了 HTML5,CSS3。
- 一些应用场景:数据结构层次化(树结构),可用于在网络中传输数据、程序的配置文件、安卓程序和IOS程序还有PC程序 UI 界面 XML 文件的编写等。
- 和 HTML 不同的是 XML 可以自定义标签。
- 一个标签的以尖括号 <> 开始以尖括号斜杠 </> 结束。自闭标签 </>
- XML 文件以 .xml 后缀结束。
如下 XML 文件的树结构格式数据:
<?xml version="1.0" encoding="utf-8"?>
<中国>
<北京>
<海淀></海淀>
<丰台></丰台>
</北京>
<广西>
<贺州></贺州>
<桂林></桂林>
</广西>
<广东>
<中山>
<小榄></小榄>
</中山>
<东莞></东莞>
</广东>
</中国>
XML 语法
1. 文档声明
用来声明 XML 的基本属性,用来指挥解析引擎去如何解析 XML,必须写在文档的第一行并且只能包含一个文档声明。
文档声明用 <?xml 这里是声明属性 ?> 。通常见只有这么一句 <?xml version="1.0" encoding="utf-8"?>。
version 必须存在的属性 ,值为 XML 版本 1.0 即可。
encoding 属性为保存和读取的编码,只有保存是的编码表和读取时的编码表一致时才不会乱码。
2. 元素
一个 XML 标签就称为是一个元素。
一个标签的以尖括号 <> 开始以尖括号斜杠 </> 结束,开始标签与结束标签直接可以包含文本数据称为标签体,自闭标签 </> 直接内部斜杠结束。如(<A>数据</A>,</A>)。
一个标签可以包含任意多个子标签,必须合理嵌套。(错误的:<A><B></A></B>,正确的 <A><B></B></A>)。
只允许有一个根标签。
XML 标签体内的空格将会被保留。(嵌套标签没问题,但是如果标签体内是字符串数据,就不能有多余的空格)。
元素命名规则:
区分大小写,如(<A>和<a>是不同的标记)。
不能以数字或标点符号或“_”开头。
不能以 xml XML Xml 等开头。
不能包含空格。
标签名称中不能包含冒号(:)。
3. 属性
一个标签可以定义多个属性。
属性定义在 开始标签中 ,自闭标签一样。如(<china capital="beijing"/>)。
属性名定义需要遵循和xml元素相同命名规则。
属性值需要用英文 双引号 " " 或 单引号 ' ' 括起来。
4. 注释
定义 <!-- 注释内容 --> 。
不能出现在文档声明前面。
不能嵌套注释。(<!-- <!-- --> -->)
5. CDATA区 / 转义字符(实体引用)
CDATA区:
像 "<" 和 "&" 字符在 XML 元素中都是非法的。
"<" 会产生错误,因为解析器会把该字符解释为新元素的开始。
"&" 会产生错误,因为解析器会把该字符解释为字符实体的开始。
CDATA 部分中的所有内容都会被解析器忽略。
CDATA 部分由 "<![CDATA[ 开始,内容,由 ]]>" 结束:
<?xml version="1.0" encoding="utf-8"?>
<中国>
<北京>
<![CDATA[1 < 2 & 1 > 0]]>
</北京>
</中国>
转义字符(实体引用):
由 “&” 开始,分号 “;” 结束。
在 XML 中,有 5 个预定义的实体引用:
符号 | 转义 | 语义全称 | 中文全称 |
< | < | less than | 小于号 |
> | > | greater than | 大于号 |
& | & | ampersand | 与 |
' | ' | apostrophe | 单引号 |
" | " | quotation mark | 双引号 |
<?xml version="1.0" encoding="utf-8"?>
<中国>
<北京>
1 < 2 & 1 > 0
</北京>
</中国>
6. 处理指令
简称 PI (processing instruction)。处理指令用来只会解析引擎如何解析 XML 文档内容。
如下用处理指令加载 CSS 样式 <?xml-stylesheet type="text/css" href="index.css"?> :
XML 文件:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="index.css"?>
<中国>
<北京>这里是不是有北京人呐!</北京>
<广西>广西人在这里哦!</广西>
</中国>
CSS 文件:
@charset="utf-8";
北京 {
font-size: 30px;
color: red;
}
广西 {
font-size: 30px;
color: orange;
}
效果图:
其实文档声明也是处理指令,比较特殊,必须出现的。
XML Schema 概述
- XML Schema 是一种用于定义和描述 XML 文档结构与内容的模式语言。(约束 XML)。
- XML Schema 是用 XML 语法结构(XML 文件),后缀名为 .xsd。
- 一个 XML Schema 文档通常称之为模式文档(约束文档),遵循这个约束文档的规则写的 XML 文件称之为实例文档。
- 和 XML 文件一样 XML Schema 文档也必须有一个根节点,但这个根节点的名称为 Schema。
- 支持更多的数据类型,并支持用户自定义新的数据类型。
- 对引入多个不同 XML Schema 模式文档 的 XML 文件中相同的元素或属性名称冲突有非常好的解决办法,就是元素或属性绑定到名称空间上。
XML Schema 名称空间(需要掌握)
问题?:对引入多个不同 XML Schema 模式文档 的 XML 文件中相同的元素或属性名称冲突,为了解决这个问题,就需要保证元素和属性保证全世界的唯一性,域名则能保证全世界唯一的,所以会使用域名作为 Schema 模式文档的名称空间。
我们直接看 Schema 模式文档 和 xml 实例文档 的小例子,下面是我编写的模式文档和实例文档根元素片段:
Schema 模式文档 html.xsd :
<?xml verson="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.bin-instance.cn"
elementFormDefault="qualified">
<!-- 代码省略... 现在只需看 schema 根元素 -->
<xs:schema>
XML 实例文档 html.xml 遵循 html.xsd:
<?xml version="1.0" encoding="utf-8"?>
<app:html xmlns:app="http://www.bin-instance.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.bin-instance.cn html.xsd">
<!-- 代码省略... 现在只需看 自定义的根元素 -->
</app:html>
语法解释:
属性 | 解释 |
xmlns:xxx | xmlns 属性 : 冒号 + xxx 自定义缩写名,指定当前文档使用的元素和属性都来自哪个名称空间。 |
xxx | xxx 表示名称空间的引用,使用此名称空间 xxx:属性或元素名 就能引用元素或属性。 |
模式文档根元素属性片段 | 语义 | 实例文档根元素属性片段 | 语义 |
targetNamespace ="http://www.bin-instance.cn" | targetNamespace:用于声明 Schema 模式文档中声明的元素及属性都属于这个名称空间。 值是域名,保证全世界唯一。 | xmlns:app ="http://www.bin-instance.cn" | xmlns,指定此 XML 实例文档中所使用的元素和属性都来自哪个 Schema 模式文档的名称空间。 :app,为这个名称空间起的缩写名(别名),是自定义的。 |
xmlns:xs ="http://www.w3.org/2001/XMLSchema" | xmlns,指定 Schema 模式文档中所使用的元素和属性都来自哪个名称空间。编写模式文档所需要的元素和属性及规则都在这个固定的名称空间中。 :xs,为这个名称空间起的缩写名(别名),是自定义的。 | xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" | xmlns,引入这个固定的名称空间是为了使用这个名称空间中的一个属性 schemaLocation。 :xsi,为这个名称空间起的缩写名(别名),是自定义的。 |
elementFormDefault ="qualified" | 指定该 Schema 文档中的根元素及其所有子元素都属于 targetNamespace 所指定的名称空间。 不声明此属性默认值就是 qualified。 | xsi:schemaLocation ="http://www.bin-instance.cn html.xsd" | xsi 名称空间引用 :schemaLocation 属性。xmlns 属性只是指定使用哪个名称空间中的元素和属性,但并没有指定模式文档的地址,所以需要指定模式文档地址。特殊名称空间不需要指定模式文档的地址,因为解析XML的程序内置了模式文档文件。 属性值语法:" 名称空间 空格 相对或绝对地址模式文档文件 ...... 可引入多个模式文档" |
特殊名称空间 | 解释 |
http://www.w3.org/2001/XMLSchema | 编写模式文档所需要的元素和属性及规则都在这个固定的名称空间中。 |
http://www.w3.org/2001/XMLSchema-instance | 编写实例文档为了使用一个属性 schemaLocation ,指定模式文档地址。 |
特殊名称空间不需要在 schemaLocation 指定模式文档的地址,因为解析XML的程序内置了模式文档文件。 |
1. 使用默认名称空间
- 定义:在声明 xmlns 属性时,不起缩写名。
- 作用:不需要使用缩写名引用元素或属性。
<?xml version="1.0" encoding="utf-8"?>
<html xmlns="http://www.bin-instance.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.bin-instance.cn html.xsd">
<head>
<title>宇宙我最帅</title>
<meta charset="utf-8"/>
</head>
<body>
<div>
<p>玫瑰花的葬礼</p>
<p>埋葬深深爱着的你</p>
<p>默默离去,是我给你最后的温柔</p>
</div>
</body>
</html>
2. 引入多个名称空间
一般有默认名称空间和有缩写名的名称空间,上一个例子也是。
<?xml version="1.0" encoding="utf-8"?>
<html xmlns="http://www.bin-instance.cn"
xmlns:attr="http://www.bin-instance-attr.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.bin-instance.cn html.xsd
http://www.bin-instance-attr.cn html_attr.xsd">
<head>
<title>宇宙我最帅</title>
<meta charset="utf-8"/>
</head>
<body>
<div>
<p attr:color="red">玫瑰花的葬礼</p>
<p attr:align="center">埋葬深深爱着的你</p>
<p attr:align="right">默默离去,是我给你最后的温柔</p>
</div>
</body>
</html>
3. 不使用名称空间引入 Schema
- 前提条件:当前文档中仅使用一个 Schema 文件。
- 需要属性:noNamespaceSchemaLocation 来源于实例文档名称空间 http://www.w3.org/2001/XMLSchema-instance 。
<?xml version="1.0" encoding="utf-8"?>
<html xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="html.xsd">
<head>
<title>宇宙我最帅</title>
<meta charset="utf-8"/>
</head>
<body>
<div>
<p>玫瑰花的葬礼</p>
<p>埋葬深深爱着的你</p>
<p>默默离去,是我给你最后的温柔</p>
</div>
</body>
</html>
XML Schema 语法(如不需要,了解即可)
有两种类型:
- 简易类型 (SimpleType),不包含属性和子元素的元素(标签),标签体内只包含文本数据。
- 复合类型(ComplexType),包含了属性和子元素还有文本数据的元素。
1. 简易类型 SimpleType & 限定 Restriction
简易类型 (SimpleType),不包含属性和子元素的元素(标签),标签体内只包含文本数据。文本的数据类型常用的有:
- xs:string
- xs:decimal
- xs:integer
- xs:boolean
- xs:date
- xs:time
声明元素(标签) | 元素 | 元素名 | 数据类型 | 可选 |
element | name | type | default:默认值。 fixed:固定值,不可赋值和改变。 | |
| ||||
声明属性 | attribute | name | type | default:默认值。 fixed:固定值,不可赋值和改变。 use:在缺省的情况下,属性是可选的。如需规定属性为必选,使用 use 属性赋值为 required。 |
|
限定:(restriction)用于为 XML 元素或者属性 定义 可接受的值 。对 XML 元素的限定被称为 facet。
对值的限定,下面的例子定义了带有一个限定且名为 "age" 的元素。age 的值不能低于 0 或者高于 120:
<xs:element name="age">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="120"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
标签使用:
<age>120</age>
代码阅读:
- 第一行 element 声明了一个元素名叫 age 。
- 第二行 simpleType 声明了使用简易类型限定 age 元素。
- 第三行简易类型下包装了限定元素 restriction ,并使用属性 base 基于 integer 类型进行限定。
restriction 数据类型的限定有:
限定元素 | 描述 |
---|---|
enumeration | 定义可接受值的一个列表 |
fractionDigits | 定义所允许的最大的小数位数。必须大于等于0。 |
length | 定义所允许的字符或者列表项目的精确数目。必须大于或等于0。 |
maxExclusive | 定义数值的上限。所允许的值必须小于此值。 |
maxInclusive | 定义数值的上限。所允许的值必须小于或等于此值。 |
maxLength | 定义所允许的字符或者列表项目的最大数目。必须大于或等于0。 |
minExclusive | 定义数值的下限。所允许的值必需大于此值。 |
minInclusive | 定义数值的下限。所允许的值必需大于或等于此值。 |
minLength | 定义所允许的字符或者列表项目的最小数目。必须大于或等于0。 |
pattern | 定义可接受的字符的精确序列。(正则表达式) |
totalDigits | 定义所允许的阿拉伯数字的精确位数。必须大于0。 |
whiteSpace | 定义空白字符(换行、回车、空格以及制表符)的处理方式。 可选值有三种: 1. preserve,这意味着 XML 处理器不会移除任何空白字符。默认值。 2. replace,这意味着 XML 处理器将移除所有空白字符(换行、回车、空格以及制表符)。 3. collapse,这意味着 XML 处理器将移除所有空白字符(换行、回车、空格以及制表符会被替换为空格,开头和结尾的空格会被移除,而多个连续的空格会被缩减为一个单一的空格)。 |
2. 复合类型 ComplexType
复合类型(ComplexType),包含了属性和子元素还有文本数据的元素。可以有如下可选类型:
- 仅包含属性
- 仅包含元素
- 仅包含文本
- 混合包含属性、元素、文本
带有混合内容的例子:
<xs:element name="letter">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="orderid" type="xs:positiveInteger"/>
<xs:element name="shipdate" type="xs:date"/>
</xs:sequence>
</xs:complexType>
</xs:element>
代码阅读:
- 第一行 element 声明了一个元素名叫 letter 。
- 第二行 complexType 声明使用符合类型限定 letter 元素。minxed="true" 表示标签体内字符串可以出现在子元素之间。
- 第三行 sequence 指示器表示子标签必须按顺序出现。
标签使用 :
<letter>
Dear Mr.<name>John Smith</name>.
Your order <orderid>1032</orderid>
will be shipped on <shipdate>2001-07-13</shipdate>.
</letter>
指示器类型:
指示器 | 解释 | |
Order 顺序指示器 | all | 指示器规定子元素可以按照任意顺序出现,且每个子元素必须只出现一次 |
Choice | 规定可出现某个子元素或者可出现另外一个子元素(非此即彼) | |
sequance | 规定子元素必须按照特定的顺序出现 | |
Occurrence 出现频率指示器 | maxOccurs | 指示器可规定某个元素可出现的最大次数 |
minOccurs | 指示器可规定某个元素能够出现的最小次数 | |
Group 组指示器 | group | 看文档 XML Schema 指示器 | 菜鸟教程 |
3. 附加内容
-
对于所有的 "Order" 和 "Group" 指示器(any、all、choice、sequence、group name 以及 group reference),其中的 maxOccurs 以及 minOccurs 的默认值均为 1。
Schema 标签块的 type 复用:
<xs:element name="html" type="prodtype"/>
<xs:complexType name="prodtype">
<xs:attribute name="bgcolor" type="xs:string"/>
</xs:complexType>
像 complexType 和 simpleType 都可以单独定义出来,进行抽象的给元素(标签)或属性进行 type 引用。
4. 练习实例
Schema 模式文档 html.xsd :
<?xml verson="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.bin-instance.cn"
elementFormDefault="qualified">
<xs:element name="html">
<xs:complexType>
<xs:sequance>
<xs:element name="head">
<xs:complexType>
<xs:element name="title" type="xs:string"/>
<xs:element name="meta">
<xs:complexType>
<xs:attribute name="charset" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:complexType>
</xs:element>
<xs:element name="body">
<xs:complexType>
<xs:element name="div" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:element name="p" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
</xs:complexType>
</xs:element>
</xs:complexType>
</xs:element>
</xs:sequance>
</xs:complexType>
</xs:element>
<xs:schema>
XML 实例文档 html.xml 遵循 html.xsd:
<?xml version="1.0" encoding="utf-8"?>
<app:html xmlns:app="http://www.bin-instance.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.bin-instance.cn html.xsd">
<app:head>
<app:title>宇宙我最帅</app:title>
<app:meta charset="utf-8"/>
</app:head>
<app:body>
<app:div>
<app:p>玫瑰花的葬礼</app:p>
<app:p>埋葬深深爱着的你</app:p>
<app:p>默默离去,是我给你最后的温柔</app:p>
</app:div>
</app:body>
</app:html>
用 IDE 编程工具进行粘贴两个文件进行校验图:
校验成功
校验成功,尝试写未定义元素
5. 编写 Schema 一句话
最后补充一句:编写 Schema 文件时,复合类型可嵌套复合类型和简易类型,一旦一个元素或属性嵌套了简易类型,就无法再延伸嵌套复合类型和简易类型。
详细参考 XML Schema 教程文档