文章目录
1、XML
1.1、xml是什么? 为什么要学习xml?
- xml(Extensible Markup Language);
- xml 是一种标记语言,很类似html;
- xml 是为了存储数据的;
- xml 没有被预定义,需要自己定义标签;
- xml 被设计为自我描述性(头标签,尾标签)
1.2、xml 和 html 的区别
- xml 并不是 html 的替代;
- xml 是为了存储数据而生;html 是为了显示数据而生;
1.3、xml 的优点
- 可以对各种编程语言的数据进行管理;
- 任何平台都能通过解析器读取xml的数据;
1.4、xml 语法
- 文档声明
- 元素(标签)
- 属性
- 注释
1.4.1、文档声明
-
最简单的一种 版本;
<?xml version="1.0"?>
-
加上encoding属性,说明文档字符编码;
<?xml version="1.0" encoding="utf-8"?>
1.4.2、元素
-
元素是xml文档内容的基本单元;语法上,一个元素包括一个起始标记,一个结束标记以及标记之间的数据内容
-
Eg:
<手机>华为手机</手机>
-
-
元素中还可以嵌套别的元素。在XML文档中,仅有一个根元素,可以有多个子元素,允许出现空元素
1.4.2.1、xml的命名规则
老生常谈,其实每种语言的命名规则几乎都是大差不差的,接下来让我们看一下xml的命名规则
- 可以含数字,字母和其他符号
- 不能以数字或标签符号开始
- 不能以**“xml”**开头
- 不能有空格
- 可以用任何名称,没有保留字!
1.4.2.2、xml的语法规则
- 所有的xml都要有闭标签
- xml标签对大小写敏感
- xml标签必须正确嵌套
- xml文档必须含有根标签 同html语言一样,在声明之后,有个<html></html>的根标签
- 实体引用
- < —-> < 小于
- > —–> > 大于
- & ——> & &号
- ' —-> ‘’ 单引号
- " —-> “” 双引号
1.4.3、属性
属性? 属性就是用来修饰某个元素的
Eg: 属性名 = 属性值
<users>
<name id="王大麻子" class="uname"></name>
</users>
关于属性,我们有以下注意点
- 属性值必须被引号括起来
- 元素的属性是成键值对的
- 用来修饰同一个元素的属性的属性名不能相同
- 属性值不能包含“ & ”,“ ‘ ”,“ < ”
Eg:
<?xml version="1.0" encoding="utf-8"?>
<users>
<user>
<name>王五</name>
<num>001</num>
<address>汉中</address>
</user>
<user>
<name>李四</name>
<num>002</num>
<address>西安</address>
</user>
<user>
<name>赵武</name>
<num>003</num>
<address>榆林</address>
</user>
</users>
1.5、xml约束
1.5.1、何为约束?
在xml技术里,可以编写一个文档来约束一个xml文档的书写规范
那么我们引入xml约束是干什么的呢?
如果我们什么约束都不加,那么用户就可以随意修改,这样好么,很明显,并不好,所以我们就引入了xml约束
1.5.2、约束技术
1.5.2.1、DTD 约束
语法相对简单,功能也相对简单。学习成本也低。
Eg:
约束文件
<?xml version="1.0" encoding="UTF-8" ?>
<!ELEMENT users (user+) >
<!ELEMENT user (name,num,address) >
<!ELEMENT name (#PCDATA) >
<!ELEMENT num (#PCDATA)>
<!ELEMENT address (#PCDATA)>
xml文件
<?xml version="1.0" encoding="utf-8"?>
<!-- 引入dtd约束 -->
<!DOCTYPE users SYSTEM "user.dtd">
<users>
<user>
<name>王五</name>
<num>001</num>
<address>汉中</address>
</user>
<user>
<name>李四</name>
<num>002</num>
<address>西安</address>
</user>
<user>
<name>赵武</name>
<num>003</num>
<address>榆林</address>
</user>
</users>
1.5.2.1.1、引入dtd文件的方式
方法1
-
外部DTD的引入方式 <!DOCTYPE 文档根结点 SYSTEM “DTD文件的URL”>
-
外部引入就是我们独立建一个dtd文件, 然后在我们的xml文件中引入
-
Eg: <!DOCTYPE users SYSTEM “user.dtd”>
-
dtd文件
<?xml version="1.0" encoding="UTF-8" ?> <!ELEMENT users (user+) > <!ELEMENT user (name,num,address) > <!ELEMENT name (#PCDATA) > <!ELEMENT num (#PCDATA)> <!ELEMENT address (#PCDATA)>
xml 文件
<?xml version="1.0" encoding="utf-8"?> <!-- 引入dtd约束 --> <!DOCTYPE users SYSTEM "user.dtd"> <users> <user> <name>王五</name> <num>001</num> <address>汉中</address> </user> <user> <name>李四</name> <num>002</num> <address>西安</address> </user> <user> <name>赵武</name> <num>003</num> <address>榆林</address> </user> </users>
-
-
文档根结点 指的是当前xml中的根标签。 SYSTEM 引入的系统中存在文件 "DTD文件的URL" DTD存放的位置
方法2
-
引入公共的dtd文件 <!DOCTYPE 文档根结点 PUBLIC “DTD名称” “DTD文件的URL”>
-
Eg: <!DOCTYPE users PUBLIC "user “user.dtd”>
- dtd文件
<?xml version="1.0" encoding="UTF-8" ?> <!ELEMENT users (user+) > <!ELEMENT user (name,num,address) > <!ELEMENT name (#PCDATA) > <!ELEMENT num (#PCDATA)> <!ELEMENT address (#PCDATA)>
- xml文件
<?xml version="1.0" encoding="utf-8"?> <!-- 引入dtd约束 --> <!DOCTYPE users PUBLIC "user" "user.dtd"> <users> <user> <name>王五</name> <num>001</num> <address>汉中</address> </user> <user> <name>李四</name> <num>002</num> <address>西安</address> </user> <user> <name>赵武</name> <num>003</num> <address>榆林</address> </user> </users>
-
PUBLIC 表示当前引入的DTD是公共的DTD
方法3 在xml文件中直接写dtd
-
Eg:
<?xml version="1.0" encoding="utf-8"?> <!-- 引入dtd约束 --> <!DOCTYPE users[ <!ELEMENT users (user+) > <!ELEMENT user (name,num,address) > <!ELEMENT name (#PCDATA) > <!ELEMENT num (#PCDATA) > <!ELEMENT address (#PCDATA) > ]> <users> <user> <name>王五</name> <num>001</num> <address>汉中</address> </user> <user> <name>李四</name> <num>002</num> <address>西安</address> </user> <user> <name>赵武</name> <num>003</num> <address>榆林</address> </user> </users>
1.5.2.1.2、dtd语法
-
元素
-
当定义DTD约束xml时候,这时需要在DTD中使用ELEMENT来定义当前xml中可以出现的标签名称。
格式:
<!ELEMENT 标签名 约束> 约束来限定当前标签中可以有的子标签,或者当前标签中可以书写的内容
在定义标签名的时候,约束中可以使用一些符号标签具体出现次数? 零次或者一次 \* 零次或者多次 \+ 一次或者多次 users (user+) 表示当前的users标签下可以有一个或者多个user标签 , 用来限定当前的子标签出现的顺序user (name,age,addr) user标签下只能有name age addr 子标签,并且必须按照name age addr的顺序书写 | user (name|age,addr) user下可以name或者age ,但必须有addr,并且addr必须name或age后面 #PCDATA 表明该元素可包含任何字符数据,但不能在其中包含任何子元素。只有 PCDATA 的元素通过圆括号中的 #PCDATA 进行声明 EMPTY 表明该元素不能有任何子元素或文本,仅可以使用属性。 ANY 表该元素中可以包含任何DTD中定义的元素内容 如:<!ELEMENT note ANY> <!ELEMENT age EMPTY > 当前的age标签是个空标签,它不能有文本内容。
-
-
属性
在xml中的标签上是可以书写属性的,在DTD中就需要对属性进行约束。 格式: <!ATTLIST 标签名 属性名 属性的类型 属性的约束> 如果一个标签上有多个属性 <!ATTLIST 标签名 属性名 属性的类型 属性的约束 属性名 属性的类型 属性的约束 属性名 属性的类型 属性的约束 > <标签名 属性1=”” 属性2=”” 属性3=”” >
属性的类型: CDATA 属性的value值可以是文本数据 (值1 | 值2 | 值3.... ) 表示当前的属性的value值只能是当前括号中的值 ID 表示唯一。对当前标签上的id属性进行限定,并且同一个xml中id不能重复 类型 描述 CDATA 值为字符数据 (character data) (en1|en2|..) 此值是枚举列表中的一个值 ID 值为唯一的 id IDREF 值为另外一个元素的 id IDREFS 值为其他 id 的列表 NMTOKEN 值为合法的 XML 名称 NMTOKENS 值为合法的 XML 名称的列表 ENTITY 值是一个实体 ENTITIES 值是一个实体列表 NOTATION 此值是符号的名称 xml: 值是一个预定义的 XML 值
属性的约束: REQUIRED 属性是必须书写的 Implied 属性是可选得 #fixed value 属性的value是固定的值 “值” 代表属性的默认值 user name CDATA fixed “zhangsan” <user name=”zhangsan”> user name CDATA “张三” <user />
属性的类型和约束的组合: CDATA REQUIRED CDATA Implied CDATA fixed CDATA “值” (值1 | 值2 | 值3.... ) REQUIRED ID REQUIRED
-
实体
实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了。 在DTD定义中,一条<!ENTITY …>语句用于定义一个实体。 实体可以理解成Java中预先定义好的一个常量,然后xml文件中就可以引入当前这个定义的实体。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE users[ <!ELEMENT users (user+) > <!ELEMENT user (name,age,addr) > <!ELEMENT name (#PCDATA) > <!ELEMENT age EMPTY > <!ELEMENT addr (#PCDATA) > <!ATTLIST user id ID #REQUIRED > <!ENTITY abc "地球村"> ]> <users> <user id="u001"> <name>zhangsan</name> <age></age> <addr>&abc;</addr> </user> <user id="u002"> <name>lisi</name> <age/> <addr>&abc;</addr> </user> </users>
1.5.2.2、Schema约束
语法相对复杂,功能也相对强大。学习成本相对高.