1、XML概念
XML:Extensible Markup Language 可扩展标记语言。(基本介绍见视频2)
* 可扩展:标签都是自定义的。 <user> <student>
* 功能
* 存储数据
1. 配置文件
2. 在网络中传输
* xml与html的区别
1. xml标签都是自定义的,html标签是预定义。
2. xml的语法严格,html语法松散
3. xml是存储数据的,html是展示数据
* w3c:万维网联盟
2、XML语法
- 基本语法:(如果想验证语法是否正确,我们可以将xml文件拖到浏览器中,如果浏览器可以解析且不报错,那么我们的xml文档就是正确的)
1. xml文档的后缀名 .xml
2. xml第一行必须定义为文档声明(注意,这里所说的第一行就是真正意义上的第一行,第一行必须是文档声明)
3. xml文档中有且仅有一个根标签(如下面快速入门中,<users>就是根标签)
4. 属性值必须使用引号(单双都可)引起来
5. 标签必须正确关闭
6. xml标签名称区分大小写
- 快速入门
<?xml version='1.0' ?>
<users>
<user id='1'>
<name>zhangsan</name>
<age>23</age>
<gender>male</gender>
<br/>
</user>
<user id='2'>
<name>lisi</name>
<age>24</age>
<gender>female</gender>
</user>
</users>
这里注意,如果是自闭和的标签,“/”要写在标签名后面,比如
,这个标签在HTML里面是换行的意思,但是在这里只是我们定义的一个自闭和的标签。而其他标签,“/”则写在结束标签名的前面,比如。
- 组成部分:
1. 文档声明
1. 格式:<?xml 属性列表 ?>
2. 属性列表:
* version:版本号,必须的属性(version的值默认写作1.0即可)
* encoding:编码方式。
告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1,但是我们xml文件真实的编码方式是GBK(我们在notepad++中设置文件的编码方式为ANSI,ANSI就是GBK编码的集合,具体参考文章:[各类编码方式的区别](https://blog.csdn.net/lr1916417519/article/details/83659226),反正在notepad中设置使用什么方式编码,就需要告诉浏览器使用什么方式解码。比如utf-8也可以解析中文,我们也可以使用utf-8编码解码),XML文件告知浏览器使用ISO-8859-1取解析GBK编码的文件,如果出现中文字符,就会解析错误。那么想要浏览器能解析中文,必须在文档声明中使用encoding属性设置告知浏览器此XML解码方式为GBK。
现在如果使用IDEA工具,这个工具会自动识别我们当前的编码方式并解码,不需要我们指定encoding属性
* standalone:是否独立(现在这个值都不会设置)
* 取值:
* yes:不依赖其他文件
* no:依赖其他文件
2. 指令(了解):结合css可以控制标签的样式(早起xml是用来替代html的,但是现在一般只使用xml来存储,不需要与css结合了)
* <?xml-stylesheet type="text/css" href="a.css" ?>
3. 标签:标签名称自定义的
* 规则:
* 名称可以包含字母、数字以及其他的字符
* 名称不能以数字或者标点符号开始
* 名称不能以字母 xml(或者 XML、Xml 等等)开始
* 名称不能包含空格
4. 属性:
id属性值唯一
5. 文本:
* CDATA区:在该区域中的数据会被原样展示
* 格式: <![CDATA[ 数据 ]]>
代码演示
<?xml version='1.0' encoding='utf-8' standalone='no' ?>
<!--
<?xml-stylesheet type="text/css" href="a.css" ?>
使用这个文件之后,我们发现xml文件被解析,就像浏览器解析html文件一样,不显示xml代码,只显示相应的内容
-->
<!--xml注释与html注释格式相同-->
<users>
<user id='1'>
<name>张三</name>
<age>23</age>
<gender>male</gender>
<br/>
</user>
<user id='2'>
<name>lisi</name>
<age>24</age>
<gender>female</gender>
<!--下面是代码区域-->
<code>
<!--if(a < b && a>b){}-->
<!--
我们发现上面的代码报错,因为<,>等符号是特殊字符,需要使用转义字符表示(转义字符与html相同)
虽然使用转义字符可以表示,但是这显然比较麻烦。我们可以使用CDATA区使得数据原样展示
-->
<!--if(s < b && a > c){}-->
<![CDATA[
if(a < b && a>b){}
]]]>
</code>
</user>
</users>
约束:规定xml文档的书写规则
关于XML的约束的相关概念,见视频5。
XML文件就相当于一款软件的配置文件,我们使用一款软件,如果要设置一些个性化的信息,就必须通过XML文件,软件读取相应XML文件,才能获知用户的个性化设置信息。既软件使用者编写XML文件,软件解析XML文件。
当然,这里所说的软件和用户不是普通的软件和用户,我们所说的软件是半成品软件,既框架。而用户指的就是使用框架进行开发的程序员。既程序员使用XML来与框架进行交流,从而使用框架进行开发。
而所谓的约束文档(说明文档),就是用来规定相应XML文档的书写规则。约束文档是由软件(框架)提供的。我们作为程序员,只需要看懂约束文档,并根据约束文档的规则将XML文档编写出来即可。
* 作为框架的使用者(程序员):
1. 能够在xml中引入约束文档(只有引入约束文档,才能约束相应的XML文档)
2. 能够简单的读懂约束文档(高级开发工具有很多提示)
* 分类:
1. DTD:一种简单的约束技术
2. Schema:一种复杂的约束技术
将IDEA中普通文件夹设置为资源部包(蓝色),点击想设置的文件夹,右键-Mark Directory as-source,这样就会将普通文件夹设置为蓝色的资源包。只有资源包才可以设置多层的包Package
1)DTD文档
* DTD:
* 引入dtd文档到xml文档中
* 内部dtd:将约束规则定义在xml文档中
* 外部dtd:将约束的规则定义在外部的dtd文件中
* 本地:<!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">
* 网络:<!DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件的位置URL">
DTD文档的阅读方式,见视频6-1.30。
相应的dtd约束代码如下:
<!--dtd约束文档:student.dtd-->
<!ELEMENT students (student*) > <!--定义一个students标签,里面可以存放*(零个或者多个)student子标签-->
<!ELEMENT student (name,age,sex)> <!--定义一个student标签,里面可以存放一个name、age或sex子标签,并且子标签必须按照定义的顺序出现-->
<!ELEMENT name (#PCDATA)> <!--定义一个name标签,里面可以存放#PCDATA,既字符串数据。下面的age、sex相同-->
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED> <!--声明student标签的属性,属性名称为number,而属性类型为ID,ID表示number的属性值必须唯一。#REQUIRED表示属性number必须出现-->
<!--
这里使用ELEMENT定义标签,使用ATTLIST定义属性
-->
下面是相应的使用dtd约束的文档
<!--xml文件student.xml-->
<?xml version="1.0" encoding="UTF-8" ?> <!--文档声明-->
<!--先引入dtd约束文档到当前的xml文档中-->
<!DOCTYPE students SYSTEM "student.dtd">
<!--内部dtd:少用
<!DOCTYPE students [
<!ELEMENT students (student+) >
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>
]>
-->
<students>
<student number="s001"> <!--我们发现这里number的值前面不带英文字母会报错,也不知道为啥-->
<name>zhangsan</name>
<age>23</age>
<sex>male</sex>
</student>
<student number="s002">
<name>lisi</name>
<age>24</age>
<sex>female</sex>
</student>
</students>
2)schema文档
* Schema:
* 引入:
1.填写xml文档的根元素
2.引入xsi前缀. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3.引入xsd文件命名空间. xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
4.为每一个xsd约束声明一个前缀,作为标识 xmlns="http://www.itcast.cn/xml"