知识点总结于崔希凡+王泽(广陵散)的JavaWeb视频教程,侵权请联系删除。
XML
XML
简介
XML(eXtensible Markup Language): 指可扩展标记语言
- 标记型语言:html是标记型语言,XML也是使用标签来操作的
- 可扩展:html里面的标签是固定,每个标签都有特定的含义例如:<h1> <br/> <hr/>,但是XML标签可以自己定义,可以写中文的标签 例如:<person></person>、<猫></猫>
XML标签没有被预定义,需要用户自行定义标签。 - XML的用途:XML 被设计用来传输和存储数据(XML也可显示数据,但不是主要功能)。
- XML技术是W3C组织(World Wide Web Consortium万维网联盟)发布的,目前遵循的是W3C组织于2000年发布的XML1.0规范。
xml有两个版本:1.0 1.1
使用都是1.0版本,(1.1版本不能向下兼容) - XML被广泛认为是继Java之后在Internet上最激动人心的新技术。
XML的应用

- XML语言出现的根本目的在于描述向上图那种有关系的数据。
- XML是一种通用的数据交换格式。
- 在XML语言中,它允许用户自定义标签。一个标签用于描述一段数据;一个标签可分为开始标签和结束标签,在起始标签之间,又可以使用其它标签描述其它数据,以此来实现数据关系的描述。
- XML中的数据必须通过软件程序来解析执行或显示,如IE;这样的解析程序称之为Parser(解析器)。
XML常见应用
- 用于描述qq直接传输数据,使用xm格式进行描述,具有可读性和可维护性
- XML技术除用于保存有关系的数据之外,它还经常用作软件配置文件,以描述程序模块之间的关系。(如Struts、Spring和Hibernate都是基于XML作为配置文件的)
- 在一个软件系统中,通过XML配置文件可以提高系统的灵活性。即程序的行为是通过XML文件来配置的,而不是硬编码。
XML的语法规则
文档声明
- 在编写XML文档时,需要先使用文档声明来声明XML文档,且必须出现在文档的第一行。(写了文档声明之后,表示写xml文件的内容)
最简单的语法:<?xml version=“1.0”?> - 用encoding属性说明文档所使用的字符编码。保存在磁盘上的文件编码要与声明的编码一致,否则会出现乱码。
因为码表中存储的相同字符的位置不一样,如果按照GBK码表存储字符,假定“你好”位置分别在1和2,而通过UTF-8打开,因为UTF-8码表中1 2位置上的字符是其它字符,所以会出现乱码。
字符编码强行将每一个字符对应一个十进制数字,再将十进制数字转换成计算机理解的二进制,而计算机读到这些1和0之后就会显示出对应的文字或符号。
如:<?xml version=“1.0” encoding=“GB2312”?> - 用standalone属性说明文档是否独立,即是否依赖其他文档。
如:<?xml version=“1.0” standalone=“yes”?>
元素(标签)定义
-
XML元素指XML文件中出现的标签。一个标签分为起始和结束标签(不能省略)。一个标签有如下几种书写形式:
1.包含标签主体:<mytag>some content</mytag>
2.不含标签主体:<mytag/> -
一个标签中可以嵌套若干子标签,但所有标签必须合理的嵌套,不允许有交叉嵌套。
错误示例:<mytag1><mytag2></mytag1></mytag2> -
一个XML文档必须有且仅有一个根标签,其他标签都是这个根标签的子标签或孙标签。
-
对于XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理。例如下面两段内容的意义是不一样的:
- <网址>www.itcast.cn</网址>
- <网址>
www.itcast.cn
</网址>
由于在XML中,空格和换行都作为原始内容被处理,所以,在编写XML文件时,使用换行和缩进等方式来让原文件中的内容清晰可读的“良好”书写习惯可能要被迫改变。
-
一个XML元素可以包含字母、数字以及其它一些可见字符,但必须遵守下面的一些规范:
- 区分大小写,例如,<P>和<p>是两个不同的标记
- 不能以数字或"_" (下划线)开头
- 不能以xml(或XML、或Xml 等)开头
- 不能包含空格
- 名称中间不能包含冒号(:)
属性定义
-
一个元素可以有多个属性,每个属性都有它自己的名称和取值,例如:<mytag name=“value” …/>
-
属性值一定要用引号(单引号或双引号)引起来
-
属性名称的命名规范与元素的命名规范相同
-
元素中的属性是不允许重复的
-
在XML技术中,标签属性所代表的信息也可以被改成用子元素的形式来描述,例如:
<mytag> <name> <firstName/> <lastName/> </name> </mytag>
注释
- XML中的注释语法为:<!–这是注释–>
- 注意:
1.XML声明之前不能有注释(即第一行)
2.注释不能嵌套,例如:

特殊字符
- 在xml文档中有些字符是特殊的,不能使用它们作为文本数据。例如:不能使用“<”或“>”等字符作为文本数据,所以需要使用转义字符来表示。
例如在xml中直接输入 a<b ,结果不能正常显示,因为把<当做了标签
如果就想要显示,需要对特殊字符 < 进行转义:a < b

CDATA区
当大量的转义字符出现在xml文档中时,会使xml文档的可读性大幅度降低。这时如果使用CDATA段就会好一些。
在CDATA段中出现的“<”、“>”、“””、“’”、“&”,都无需使用转义字符。这可以提高xml文档的可读性。
- 书写格式(红色部分):
<a><![CDATA[ <a> ]]></a>
处理指令
处理指令,简称PI(Processing instruction)。处理指令用来指挥解析器如何解析XML文档内容。
- 例如,在XML文档中可以使用xml-stylesheet指令,通知XML解析器,应用css文件显示xml文档内容:
<?xml-stylesheet type="text/css" href="a.css"?>
处理指令以“<?”开头,以“?>”结束,这一点与xml文档声明相同。
CSS:
gj1 {font-size: 200px; color: red;}
gj2 {font-size: 100px; color: green;}
gj3 {font-size: 10px;}
gj4 {font-size: 50px; color: blue;}
XML:
<?xml version="1.0" encoding="gbk"?> <?xml-stylesheet type="text/css" href="a.css" ?><gjm>
<gj1>中国</gj1>
<gj2>美国</gj2>
<gj3>日本</gj3>
<gj4>英国</gj4>
</gjm>
小结
- 所有 XML 元素都须有关闭标签
- XML 标签对大小写敏感
- XML 必须正确地嵌套顺序
- XML 文档必须有根元素(只有一个)
- XML 的属性值须加引号
- 特殊字符必须转义 — CDATA
- XML 中的空格、回车换行会解析时被保留
XML约束
概述
在XML技术里,可以编写一个文档来约束一个XML文档的书写规范(与xml语法无关),这称之为XML约束。
- 为什么需要XML约束?
因为xml文档是可以自定义元素的,这会让使用xml文档的应用程序无法知道xml文档的真实结构。通常应用程序都会要求xml文件的结构是固定的,以满足自己的需求,这就说明,不同的应用程序要求自己的xml文档必须符合一定的要求。 - 两个概念:
格式良好的XML:遵循XML语法的XML
有效的XML:遵循约束文档的XML
总之:约束文档定义了在XML中允许出现的元素名称、属性及元素出现的顺序等等。 - 常用的约束技术:
XML DTD
XML Schema
DTD约束
DTD(Document Type Definition),全称为文档类型定义。dtd是平面式文档,dtd文件不是xml文档,通常扩展名为“.dtd”。它是最早的xml约束。
什么是DTD约束?
DTD(Document Type Definition),文档类型定义,用来约束XML文档。例如要求xml文档的根元素必须是,在元素下可以包含0~n个元素,每个元素必须有一个number属性,而且还要有三个子元素,分别<name>、<age>、<sex>,这三个子元素的内容必须为文本内容,而不能是子元素。
创建步骤:
- 看xml中有多少个元素 ,有几个元素,在dtd文件中写几个 <!ELEMENT>
- 判断元素是简单元素还是复杂元素
复杂元素:有子元素的元素
<!ELEMENT 元素名称 (子元素)>
简单元素:没有子元素
<!ELEMENT 元素名称 (#PCDATA)>
注意:元素名称和括号之间存在空格,不然格式错误 - 需要在xml文件中引入dtd文件

注意:如果我们打开xml文件是用浏览器打开的,由于浏览器只负责校验xml的语法,不负责校验约束,所以不会起到约束作用。
如果想要校验xml的约束,需要使用工具(myeclipse工具、Idea)。
DTD的三种引入方式:
DTD约束即可以作为一个单独的文件编写,也可以在XML文件内编写。
- 使用外部DTD
<!DOCTYPE 根元素名称 SYSTEM “dtd路径”> - 使用内部DTD
<!DOCTYPE person [
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]> - 使用公共DTD(网络上的dtd文件)
<!DOCTYPE 根元素 PUBLIC “DTD名称” “DTD文档的URL”>
框架 struts2 使用配置文件就是外部的dtd文件
示例:<!DOCTYPE struts PUBLIC “-//Apache Software Foundation//DTD Struts Configuration 2.0//EN” “http://struts.apache.org/dtds/struts-2.0.dtd”>
使用DTD定义元素
-
在DTD文档中使用ELEMENT关键字来声明一个XML元素。
-
语法:<!ELEMENT 元素名称 使用规则>
规则:
(#PCDATA):指示元素的主体内容只能是普通的文本.(Parsed Character Data)
EMPTY:用于指示元素的主体为空。比如<br/>
ANY:用于指示元素的主体内容为任意类型(可以为空)。
(子元素):指示元素中包含的子元素 -
定义子元素及描述它们的关系:
- 如果子元素用逗号分开,说明必须按照声明顺序去编写XML文档。
如: <!ELEMENT FILE (TITLE,AUTHOR,EMAIL) 标签要从TITLE开始到EMAIL结束的顺序书写 - 如果子元素用“|”分开,说明任选其一。
如:<!ELEMENT FILE (TITLE|AUTHOR|EMAIL)(只能在三个标签中选择一个) - 用+、*、?来表示元素出现的次数
+:表示至少出现一次,一次或多次
*:表示可有可无,零次、一次或多次
?:表示可以有也可以无,有的话只能有一次。零次或一次
- 如果子元素用逗号分开,说明必须按照声明顺序去编写XML文档。
图例:


使用DTD定义属性
- 属性的定义格式:
<!ATTLIST 元素名称
属性名称 属性类型 属性的约束
>
- 示例:
<!ATTLIST 商品
类别 CDATA #REQUIRED 必须的
颜色 CDATA #IMPLIED 可选的
>
<!-- 对应的XML为: -->
<商品 类别=“服装” 颜色=“黄色”/>
- 属性值类型:
CDATA:表示属性的取值为普通的文本字符串
ENUMERATED (DTD没有此关键字):表示枚举,只能从枚举列表中任选其一,如(鸡肉|牛肉|猪肉|鱼肉)
ID:表示属性的取值不能重复,属性的值只能由字母,下划线开始,不能出现空白字符
如果把student元素的number属性设定为ID类型,那么每个student元素的number属性值必须是唯一的,并且ID类型的属性值不能以数字开头。 - 属性约束设置说明:
#REQUIRED:表示该属性必须出现
#IMPLIED:表示该属性可有可无
#FIXED:表示属性的取值为一个固定值。语法:#FIXED “固定值”
直接值(直接输入一个值):表示属性的取值为该默认值

示例:
<!ATTLIST 页面作者
姓名 CDATA #IMPLIED
年龄 CDATA #IMPLIED
联系信息 CDATA #REQUIRED
网站职务 CDATA #FIXED "页面作者"
个人爱好 CDATA "上网"
>
根元素为 页面作者 ,姓名元素和年龄元素的文本内容可有可无,联系信息元素的文本内容必须出现。
定义实体
实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了。相当于在Java中的用final定义一个常量值。
- 语法:<!ENTITY 实体名称 “实体内容”>
- 概念:在DTD中定义,在XML中使用
- 引用方式(注意是在XML中使用):&实体名称;

Schema约束
XML Schema 也是一种用于定义和描述 XML 文档结构与内容的模式语言,其出现是为了克服 DTD 的局限性。
概念:
- XML Schema 文件自身就是一个XML文件,但它的扩展名通常为.xsd
- 和XML文件一样,一个XML Schema文档也必须有一个根结点,但这个根结点的名称为Schema
- 应用schema约束,开发xml过程

- 编写了一个XML Schema约束文档后,通常需要把这个文件中声明的元素绑定到一个URI地址上,这个URI地址叫namespace名称空间,以后XML文件就可以通过这个URI(即名称空间)引用绑定指定名称空间的元素
XML Schema的特点:
- XML Schema符合XML语法结构。
- DOM、SAX等XML API很容易解析出XML Schema文档中的内容。
- XML Schema对名称空间支持得非常好。
- XML Schema比XML DTD支持更多的数据类型,并支持用户自定义新的数据类型。
- XML Schema定义约束的能力非常强大,可以对XML实例文档作出细致的语义限制。
- XML Schema不能像DTD一样定义实体,比DTD更复杂,但Xml Schema现在已是w3c组织的标准,它正逐步取代DTD。
Schema和DTD区别:
XML从SGML中继承了DTD,并用它来定义内容的模型,验证和组织元素。同时,它也有很多局限:
- DTD不遵守XML语法;
- DTD不可扩展;
- DTD不支持命名空间的应用;
- DTD没有提供强大的数据类型支持,只能表示很简单的数据类型。
Schema完全克服了这些弱点,使得基于Web的应用系统交换XML数据更为容易。下面是它所展现的一些新特性:
- Schema完全基于XML语法,不需要再学习特殊的语法;
- Schema能用处理XML文档的工具处理,而不需要特殊的工具;
- Schema大大扩充了数据类型,支持booleans、numbers、dates and times、URIs、integers、decimal numbers和real numbers等;
- Schema支持原型,也就是元素的继承。如:我们定义了一个“联系人”数据类型,然后可以根据它产生“朋友联系人”和“客户联系”两种数据类型;
- Schema支持属性组。我们一般声明一些公共属性,然后可以应用于所有的元素,属性组允许把元素、属性关系放于外部定义、组合;
- 开放性。原来的DTD只能有一个DTD应用于一个XML文档,现在可以有多个Schema运用于一个XML文档。
XMLSchema文档基本结构
- 在W3C XML schema规范中规定:所有的Schema文档都使用 <schema>作为其根元素
- <schema>元素可以包含一些属性。一个XML schema声明看起来经常以如下的形式出现:
<schema xmlns=“http://www.w3.org/2001/XMLSchema”
targetNamespace=“http://www.itcast.cn/20140213”
elementFormDefault=“qualified”>
xmlns="http://www.w3.org/2001/XMLSchema"代表当前xml文件是一个约束文件;
targetNamespace="http://www.itcast.cn/20140213"代表如果要使用schema约束文件,直接通过这个地址引入约束文件;
elementFormDefault="qualified"代表在xml中,所有引用xsd的全局的元素都必须加上命名空间的前缀
<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.itcast.cn/20140213"
elementFormDefault="qualified">
...
</schema>
XMLSchema简易元素和复杂元素
- 简易元素:指那些仅包含文本的元素。它不会包含任何其他的元素或属性。
<element name=“xxx” type=“string"/> - 复杂元素:复杂类型元素是包含子元素或者属性的元素
使用<complexType>:表示复杂类型 - <sequence>:表示有顺序
示例:XML文件有一个根元素person,根元素中有一个元素person,其中包含两个子类元素to和from
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/1111"
elementFormDefault="qualified">
<element name="person">
<complexType>
<sequence>
<element name="man">
<complexType>
<sequence>
<element name="name" type="string"></element>
<element name="age" type="string"></element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
XMLSchema复杂元素指示器
All:表示只能出现一次
Choice: 只能出现其中的一个
Sequence:元素按照顺序出现
maxOccurs=“unbounded” 表示出现次数没限制
定义属性(必须是复杂元素):<attribute name=“p1” type=“string” use=“required”></attribute>
<any></any>:表示任意元素
约束属性
- 写在复杂元素里面
- 写在</complexType>之前
例如:
<attribute name=“id1” type=“int” use=“required”>
代表该元素名称为id1,属性类型为int,且必须出现
对XML Schema的引用
- Schema和被约束的xml都是xml文档,如何区分哪个是被约束的文档?
使用名称空间区分被约束文档(使用w3c名称空间)
xmlns=“http://www.w3.org/2001/XMLSchema-instance” 代表当前的文档是一个实例文档(被约束的文档) - 引用自定义的schema,使用自定义的名称空间
由于一个标签上不能出现两个同名的属性,所以需要给名称空间起一个别名xsi。xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
引用本地xsd文件存放位置,使用schemaLocation:代表的是Schema文档存放的路径
<?xml version="1.0" encoding="utf-8"?>
<note
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.itcast.cn/20140213"
xsi:schemaLocation="http://www.itcast.cn/20140213 node.xsd">
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
名称空间的概念
- 在XML Schema中,每个约束模式文档都可以被赋以一个唯一的名称空间,名称空间用一个唯一的URI(Uniform Resource Identifier,统一资源标识符)表示。 在Xml文件中书写标签时,可以通过名称空间声明(xmlns),来声明当前编写的标签来自哪个Schema约束文档。如:
<itcast:书架 xmlns:itcast=“http://www.itcast.cn”>
<itcast:书>……</itcast:书>
</itcast:书架>
此处使用itcast来指向声明的名称,以便于后面对名称空间的引用。 - 注意:名称空间的名字语法容易让人混淆,尽管以 http:// 开始,那个 URL 并不指向一个包含模式定义的文件。事实上,这个 URL:http://www.itcast.cn根本没有指向任何文件,只是一个分配的名字。
使用名称空间引入Schema
- 为了在一个XML文档中声明它所遵循的Schema文件的具体位置,通常需要在Xml文档中的根结点中使用schemaLocation属性来指定,例如:
<itcast:书架 xmlns:itcast=“http://www.itcast.cn”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=“http://www.itcast.cn book.xsd"> - schemaLocation此属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的 XML schema 的位置,两者之间用空格分隔。
- 注意,在使用schemaLocation属性时,也需要指定该属性来自哪里。
示例:
company.xml

company.xsd

department.xsd

示例
为students.xml编写DTD:
<!ELEMENT students (student+)>
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number CDATA #REQUIRED>
为students.xml编写schema:
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="students" type="studentsType"/>
<xsd:complexType name="studentsType">
<xsd:sequence>
<xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="studentType">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="age">
<xsd:simpleType>
<xsd:restriction base="xsd:integer">
<xsd:maxInclusive value="100"/>
<xsd:minInclusive value="0"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="sex">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="男"/>
<xsd:enumeration value="女"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="number" type="xsd:string"/>
</xsd:complexType>
</xsd:schema>
参照Schema编写XML文档:
我们参照上面的Schema文档编写一个studens.xml文件
<?xml version="1.0" encoding="utf-8" standalone="no" ?>
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="students.xsd">
<student number="ID_1001">
<name>张三</name>
<age>23</age>
<sex>男</sex>
</student>
<student number="ID_1002">
<name>李四</name>
<age>32</age>
<sex>女</sex>
</student>
<student number="ID_1003">
<name>王五</name>
<age>50</age>
<sex>男</sex>
</student>
</students>
本文详细介绍了XML的基本概念、语法规则、常见应用,包括文档声明、元素定义、属性定义、注释、特殊字符和CDATA区。此外,还深入探讨了XML的约束,如DTD和XML Schema,以及它们在定义元素、属性和限制文档结构中的作用。XML作为一种数据交换格式,广泛应用于软件配置、数据传输和描述有关系的数据。
&spm=1001.2101.3001.5002&articleId=108736754&d=1&t=3&u=f4af34efe89d434a9a9790bcdbf6ed32)
543

被折叠的 条评论
为什么被折叠?



