前言
越学习越发现基础的重要性
会用Spring,会敲一个网页前后端
结果servlet、XML等知识体系都不是特别了解
简直是空中楼阁啊。。。
目录
- JavaWeb技术体系
- XML概述
- 一个XML案例
- XML的基本语法
4.1. XML与HTML的区别
4.2. 组成部分
4.3. 约束 - DTD
5.1. books案例
5.2. 导入 - Schema
6.1. Schema案例
6.2. 解析xsd
6.3. xml导入xsd - 总结
JavaWeb技术体系
其中知识树包含了
前端:html、css、js、jq等(这些就不介绍了,唯手熟尔)
XML、JSON数据格式
AJAX异步技术
HTTP协议知识
Servlet相关知识等
前端、后端继续深造就是各种框架了
但是没有基础知识去碰框架真的是一头雾水
XML概述
XML 是可扩展标记语言的缩写: Extensible Markup Language
- 它和HTML一样,都是标记语言,所以它很多性质也和HTML相似
- XML的作用是以一个统一的格式,组织有关系的数据,为不同的平台,不同的应用程序服务,使其数据格式相同方便传递数据(JSON也一种数据格式),由W3C组织发布
- 可扩展:标签都是自定义的< student>,< person>等,可以随时定义,随便增加减少
- XML的功能:网络中传输数据的格式;配置文件(xml是很多框架的配置文件格式)
一个XML案例
和HTML一样,同为标记语言,可以用记事本编写,然后用网页打开
当然,用高级的开发工具写会更方便,也会规定好我们的书写规范
网页打开:
XML的基本语法
- XML文件要以.xml结尾,就和HTML要以.html结尾一样
- 第一行必须是文档声明
<?xml version="1.0"?>
- XML文档有且只有一个根标签,就和HTML必须是在< html> < /html>中间编写一样,当然跟标签是自定义的,如上面的< students>
- 属性值必须用引号(单双)引起
- 标签必须有关闭标签</>
- 标签名区分大小写
XML与HTML的区别
前面的语法可以看出,虽然同为标记语言,还是有一些区别
- XML标签都是自定义的,HTML标签都是预定义的(事先规定好了)
- XML语法严格,第一行必须是声明(甚至第一行是空行都不行),必须有闭合标签等等;而HTML语法就较为松散
- XML是存储数据的,HTML是展示数据的(写XML是为了存储标签中间的数据、value,将这些数据转换成对象)
组成部分
- 文档声明
<?xml 属性列表?>
声明语法很严格,甚至< ? xml 中多加个空格就会报错,而且声明必须是第一行
属性列表有3种:
1.version(版本号)- 必须的属性
2.encoding(编码格式)- 文档的字符集
3.standalone(是否独立)- 表示xml能不能引用外部的DTD规范文件
必须严格按照123、13的顺序放置,不然会报错
- 指令 - 可以结合css样式
就和HTML引入css样式一样,<?xml-stylesheet type="text/css" href="a>
但是我们的XML主要是用来存储、传输数据的,并不是用来展示数据的,所以这个用法很少
- 标签 - 标签名称自定义< name>这样的
定义标签有一些规则要遵守:
名称可以含字母、数字以及其他的字符
名称不能以数字或者标点符号开始
名称不能以字符 “xml”(或者 XML、Xml)开始
名称不能包含空格
可使用任何名称,没有保留的字词
命名时注意:尽量简短,有描述性,避免"-" "." " :"字符
- 属性 - 标签中定义属性,和HTML中一样,用单双引号引起来,但是在XML中,尽量避免使用属性,而是使用子元素来放置值
<student name="zhangsan">
</student>
可以这么写,但要避免这种写法
尽量使用元素来描述数据。而仅仅使用属性来提供与数据无关的信息,例如id用来标识元素
- 文本
<name>三国演义</name>
但文本中出现><等特殊字符,需要用转义字符表示<,>
当出现很多特殊字符,用转义字符就比较麻烦,可以使用CDATA区放置
<![CDATA[
存放的文本
]]>
就不用转义字符也可以显示这些特殊字符了
约束
约束:规定XML文档的书写规则
程序员通过XML配置文件修改框架的设置,为了让框架能够读懂我们的修改,就需要遵守这些规则(IDEA等高级开发工具会自动提示这些规则)
主流的约束有两类:
- DTD:一种简单的约束技术
- Schema:一种复杂的约束技术
DTD
DTD是一种简单的约束技术
我们知道XML文档的构建模块: 元素、属性、实体、PCDATA(会被解析器解析的文本)、CDATA(不会被解析器解析的文本)
针对这些构建模块,DTD有不同的声明
具体的可以看W3Cschool - DTD
- 元素标签
<!ELEMENT 元素名称 类别>
或
<!ELEMENT 元素名称 (元素内容)>
- 属性
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
- 实体
<!ENTITY 实体名称 "实体的值">
类似与事先定义好的变量,在元素中可以直接引用这些实体
books案例
我们前面是直接在xml中设置添加元素
现在可以先编写DTD约束,然后通过约束来填入数据
例:
创建一个文件:books.dtd
<!--ELEMENT设置元素:根元素、子元素-->
<!ELEMENT books (book)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT book (name,author,price)>
<!--ATTLIST设置属性-->
<!ATTLIST book sn ID #REQUIRED>
<!--ENTITY设置实体-->
<!ENTITY Java "Java从入门到放弃">
导入
写好了DTD约束还不够,还要导入约束,才能约束好我们的xml文件
导入约束分为两种:
- 内部约束:将约束定义在xml文件里(直接在xml文件里写约束)
- 外部约束
外部约束又可以分为:本地约束和网络约束
本地约束:<!DOCTYPE 根标签名 SYSTEM "本地地址">
网络约束:<!DOCTYPE 根标签名 PUBLIC "DTD约束文件名" "网络URL">
内部约束
内部约束就没什么意思,一般都是外部约束
<!DOCTYPE books SYSTEM "books.dtd">
即只能选择设定好的根标签
可以直接将我们设置好的子元素写出
Schema
Schema是一种复杂的约束技术,它能够解决DTD的一些缺陷
DTD有什么缺陷呢?
DTD仅仅约束了元素、属性,并没有约束文本
price应该是一个数字,而如果写成汉字并不会报错
DTD对于元素的文本并没有限制,而Shema可以限制元素文本
一些详细设置可以看:W3Cschool - Schema
Schema案例
创建一个books.xsd文件
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema
xmlns="http://www.itcast.cn/xml"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.itcast.cn/xml"
elementFormDefault="qualified"
>
<!--books根元素,自定义属性-->
<xs:element name="books" type="booksType"/>
<xs:complexType name="booksType">
<xs:sequence>
<!--设置最少一个book元素,自定义属性-->
<xs:element name="book" type="bookType" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="bookType">
<xs:sequence>
<!--string型的name、author子元素-->
<xs:element name="name" type="xs:string"/>
<xs:element name="author" type="xs:string"/>
<!--priceType自定义属性-->
<xs:element name="price" type="priceType"/>
</xs:sequence>
<!--元素属性:序号是string型,且必须-->
<xs:attribute name="sn" type="xs:string" use="required"/>
</xs:complexType>
<xs:simpleType name="priceType">
<!--对属性的限制:restriction,必须在simpleType、simpleContent 或 complexContent 定义的约束-->
<!--限定为整形,0-200-->
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="200"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
解析xsd
- .xsd文件本质是一个xml文件,开头必须声明
- 根目录是xs:schema,其中在< xs:schema>中配置很重要
<xs:schema
xmlns="http://www.itcast.cn/xml"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.itcast.cn/xml"
elementFormDefault="qualified"
>
xmls自定义的命令空间,自己设置
xmls:xsi前缀是一个可选的值:例如上面的是w3提供的2001版的一个约束
targetNamespace要和xmls一样,表示文档中要定义的元素来自什么命名空间
elementFormDefault表示要求xml文档的每一个元素是否都由有命名空间指定(qualified和unqualified)
-
complexType定义复杂类型,可以包括元素、序列关系(sequence)、选择关系(choice),book,books这种要包含多个元素的就可以选择complexType
simpleType定义简单类型,规定一个元素文本部分的类型,或规定一个元素属性的所属类型,name等仅仅规定类型的选择simpleType -
限定restriction,必须在simpleType、simpleContent 或 complexContent 定义的约束,也就是说如果想要规定complexType的某个元素,就需要将该元素单独设置一种属性
-
xs:element等标签设置可以去看W3Cshool的详解
xml导入xsd
<books
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast.cn/xml books.xsd"
xmlns="http://www.itcast.cn/xml">
</books>
这里的设置要和xsd文件中的设置一样
- xmlns:xsi约束设置
- xsi:schemaLocation是xsd文件所在位置
- xmlns是前缀(如果不写的话,xml中的每个元素都要加上xsi:schemaLocation位置),且现在是一个xsd,可以使用默认空
- 如果多个xsd,前缀要命名xmlns:a等
从我们自定义的空间中得到book
前面设置了price是integer,且0-200
但是,注意:前面设置的xs:string定义的string类型数据,可以填入整数
(和Java中String可以是数字一样)
总结
- xml是一种可扩展的标记语言,它使数据有统一的格式,主要用于传输数据或者配置文件
- xml的语法很严格,规定好了:第一行必须是声明,声明中有3个属性也必须按顺序放置;有且只有一个根元素;元素必须闭合;属性必须用单双引号引起;元素名称区分大小写;元素名称也有一系列的规定
- 同为标记语言,xml与html的区别在与:xml很严格;xml标签自定义;xml主要用于传输数据和存储数据
- xml的组成部分:声明、指令、标签、属性、文本
- 为了改变框架的设置,需要框架给出xml的约束,xml的约束有两种:DTD简单约束;Schema复杂约束
- DTD约束很简单,它针对元素、属性、实体有一定的规定;缺点在与无法规定文本
- Schema解决了DTD的缺陷,Schema本质上是一个xml,对于每种元素,每个文本,每个属性都可以设置,详细但比较复杂,很多框架约束都是schema