Web开发的配置技术-XML

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>&lt;a&gt;</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
发布了161 篇原创文章 · 获赞 93 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/JunSIrhl/article/details/103933123