1、xml定义及用途
XML是一种可扩展标记语言,被设计用来结构化、存储和传输信息。xml重点在于定义了数据的结构,这种数据传输结构独立于软件和硬件,用于各种应用程序之间的数据传输,如mybatis的mapper.xml、Spring的配置文件等,均支持使用xml文档来定义程序中要用到的数据。
而xml语言本身 不提供任何预定义的标签,所有的标签由文档的使用者定义、识别。这体现了xml文档的扩展性。例如,mybatis程序可以识别、解析xml文档中的select标签,但并不能解析bean标签。
2、xml语法
XML 元素
XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。一个元素可以包含其他元素、文本、属性。
一个简单的xml文档如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!-- This is a comment -->
<book date="08/08/2008">
<author>J. K. Rowling/author>
<title>Harry Potter</title>
<language>english</language>
<content>Young wizarding student Harry Potter's six years of study and adventures before and after Hogwarts</content>
</book>
xml文档第一行<?xml version="1.0" encoding="UTF-8"?>是xml的声明,该声明定义了xml文档的版本(1.0)以及编码(UTF-8)。
第二行<!-- This is a comment -->是一个注释信息。
第三行<book>是文档的根元素开始标签,最后一行</book>是根元素的结束标签,每个xml都有且只有一个根元素。标签中的date是标签<book>的属性。
第四行到第七行是根元素的子元素,<author>、<title>、<language>、<content>都是根元素<book>的子元素。这几个子元素都包含文本。
一个xml文档有如下约束:
- xml文档必须要有根元素,该根元素是其他所有元素的父元素
- 所有元素都必须要有关闭标签,不能省略
- 标签对大小写敏感,<title></title>与<Title></Title>是不同的标签。
- 元素命名规则:
- 名称可以包含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字母 xml(或者 XML、Xml 等等)开始
- 名称不能包含空格
XML 属性
xml属性可用来提供元素有关元素的信息,通常元数据应当存储为属性,而数据本身应当存储为元素。
xml属性有如下约束:
- 属性值必须加引号,单引号和双引号均支持,若属性值本身包含双引号,可使用单引号例如:<if test='pk != "abc"'>
- 属性不能包含多个值
xml实体引用
在xml元素中,一些符号有特殊意义,如果元素中出现"<"符号,那么xml文档解析时会把这个符号当作是下一个元素的开始,就会出现错误。针对这些特殊意义的符号,可通过对应的实体进行替换,xml中预定义了一下5个实体引用:
< | < | 小于 |
> | > | 大于 |
& | & | 与 |
' | ' | 单引号 |
" | " | 双引号 |
例如在mybatis中mapper.xml文件中,经常会需要实体引用<和>替换sql语句中的"<"和">"。
3、xml文档约束
xml语言本身对xml文档没有任何预定义的元素、标签、属性。这些都是由使用者去约定的,使用者通常会定义应用程序能够识别、解析的一套xml约定,要想编写的xml文档能够正确的被该使用者所解析、处理,那么编写xml文档的人需按照定义的xml约定写出xml文档。xml文档定义约束的方式有两种:DTD(Document Type Definition)和XSD(XML Schemas Definition)
DTD
DTD是通过<!DOCTYPE>标签来进行声明的,<!DOCTYPE>标签声明的DTD分为内部DTD和外部DTD,格式如下:
- 内部DTD,也就是DTD定义的内容直接写在<!DOCTYPE>标签里面,格式如下,root-element-name为该xml文档的根元素的名称,中括号[]里面就是定义的DTD的具体内容:
<!DOCTYPE root-element-name [] >
- 外部DTD,即DTD的定义来自外部,又分为私有DTD和公共DTD,私有DTD格式如下:
<!DOCTYPE root-element-name SYSTEM url >
公共DTD格式定义如下,
<!DOCTYPE root-element-name PUBLIC public-name url>
公共DTD的public-name表示公共名称,其格式为"注册//组织//类型 标签//语言":
- 注册:组织是否由国际标准化组织(ISO)注册,+表示是,-表示不是
- 组织:组织名称,如:W3C
- 类型:一般是DTD
- 标签:指定公开文本描述,即对所引用的公开文本的唯一描述性名称,后面可附带版本号
- 语言:DTD语言的ISO 639语言标识符,如:EN表示英文,ZH表示中文
例如mybatis的mapper.xml声明的DTD格式如下,根据这个定义,在解析xml文档时,找到对应的DTD定义也就是http://mybatis.org/dtd/mybatis-3-mapper.dtd这个rul所指的DTD,根据DTD里面的定义的元素、标签、属性来解析该xml文档。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.study.mybatis.mapper.UserMapper">
<select id="selectUsersByNameAndAge" resultType="com.study.entity.User">
SELECT * FROM user WHERE name = #{name} and age = #{age}
</select>
</mapper>
打开mybatis-3-mapper.dtd这个DTD,可以看到里面定义mapper根元素下包括的子元素:
而这些子元素与我们在编译器中提示的子元素是一致的。同时在我们输入未定义的元素时,编译器也会提示错误信息。
XSD
XSD是定义 XML 文档的合法构建模块,与DTD作用类似,比DTD强大,其重要的能力之一就是对数据类型的支持。
XSD是由xml编写,可以使用xml的解析器来编辑、解析Schema 文件。
在xml文档中,通过根元素中的属性来对XSD进行声明,例如pom.xml文档中声明如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
</project>
xmlns="http://maven.apache.org/POM/4.0.0":命名空间的声明,类似包名,告诉schema验证器这个xml文档中的所有元素都被声明于http://maven.apache.org/POM/4.0.0这个命名空间。
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance":xml遵循的标签规范
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd":定义xmlschema的地址,也就是xml书写时需要遵循的语法,两部分组成,前面部分就是命名空间的名字,后面是xsd(xmlschema)的地址