简介
起因
近期在看java
时看到了公司的框架,公司自己的分布式jsf
框架在配置时可以引入自己的jsf
命名空间,感觉挺有意思的,就把xml
的相关东西系统看了一下。
xml
基本介绍
xml
全称:Extenable Markup Language
,即'可扩展标记语言',是一种长的有点像HTML
的语言。
据说xml
最初设计出来是用来传递数据的。最初也确实如此,在前后端数据传递和配置文件书写中大量用到了xml
。在web
开发中,也被用来简化数据的存储和共享。
- 现在前后端的数据传递使用
json
居多【根据我接触的项目】。java EE
的配置文件现在使用yaml
语言居多,yaml
语言有点像Python
,在内容较多的情况下比xml
配置文件结构清晰,还可以使用Markdown
语言配置。java Spring
的配置现在提倡使用java
配置而非xml
,因为使用java
配置更加方便简洁,而且配置的数据硬编码可以加密,但是xml
加密不了。
综上所述,xml
似乎有点过时了,但是在java EE
的配置中xml
仍然有它存在的意义。而且,xml
的优点仍然很显著:跨平台和兼容性。xml
和txt
是两种可以在任何系统中兼容的文件格式。
本文内容
主要介绍xml
的使用方法,会介绍xml
的两种文档定义格式:DTD
和XML Schema
。DTD
略过,重点介绍XML Schema
,因为貌似后者用的更多。
xml
的基本用法
文档格式
xml
的文档格式是树形的,即只能有一个根节点,上级和下级的数量对应是1:n
它大概长下面这样:
<?xml version="1.0" encoding="ISO-8859-1/UTF-8/GBK"?>
<root>
<childA>
<childAA>...</childAA>
<childAB>...</childAB>
</childA>
<childB attributeA="...">
<childBA>...</childBA>
</childB>
</root>
所有的
xml
文档均由以下简单的模块构建而成:
- 元素
- 属性
- 实体【
<
之类的】CDATA
【Character Data】【字符数据,不解析,当做标记对待】PCDATA
【Parse Character Data】【和上边的区别在于这个会被解析】
注意以下几点:
-
所有的标签必须关闭【
<a></a>
或者<a />
都行】 -
区分大小写
-
特殊字符使用实体引用
-
符号 实体表示 含义 解释 < <
小于号 less than > >
大于号 greater than & &
和 ' '
单引号 " "
双引号
-
-
xml
空格会保留 -
属性值要使用双引号
xml
命名空间
xml
中的元素名称、属性名称什么的都是开发者自己定义的,所以经常会出现同名。因此引入"命名空间"
<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
格式为:
xmlns:namespace-prefix="namespaceURI"
当然,也可以使用默认命名空间:
<table xmlns="http://www.w3.org/TR/html4/">
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>
两者结合也可以,下面是一个web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- xsi:schemaLocation 这个意思是 schemaLocation 是 xsi 作用域定义的属性(当然,这里和其他作用域的xsd文件指定有关)-->
</web-app>
- 此文件的编码格式是
UTF-8
- 根元素是
web-app
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
这一句的意思是:默认的命名空间是http://xmlns.jcp.org/xml/ns/javaee,也就是说如果在下面有一个<a></a>
这样没有前缀的标签的话,就默认他是在此命名空间定义的。xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
这一句的意思是:定义了一个前缀指向了另一个命名空间,如果下面有一个<xsi:a></xsi:a>
这样的标签,则a
标签是在http://www.w3.org/2001/XMLSchema-instance中定义的xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
这一句的意思是前面的命名空间 xsi 有个属性,叫``schemaLocation`,这里对这个属性进行了赋值。(值的意思是对应的xml命名空间和空间对应的标签规范的地址)
xml
的格式定义
xml
有两种格式定义语言,最开始是DTD
,
DTD
DTD
是用来定义xml
文档的,这里介绍DTD
的基本使用。
按照之前我们说的xml
由五种模块构成,我们同样按照这个思路来介绍DTD
对这五种模块的定义。
元素
元素的声明如下:
<!ELEMENT 元素名称 类别>
<!ELEMENT 元素名称 (元素内容)>
<!--空元素-->
<!ELEMENT 元素名称 EMPTY>
<!---->
<!ELEMENT >
<!--只有PCDATA的元素-->
<!ELEMENT 元素名称 (#PCDATA)>
<!--带有任何内容的元素-->
<!ELEMENT 元素名称 ANY>
<!--带有子元素的元素-->
<!ELEMENT 元素名称 (子元素名称1,......)><!--元素出现且仅出现一次-->
<!ELEMENT 元素名称 (子元素名称1*,......)><!--星号表示出现零次一次或多次-->
<!ELEMENT 元素名称 (子元素名称1+,......)><!--加号表示出现一次或多次-->
<!ELEMENT 元素名称 (子元素名称1|子元素名称2,......)><!--出现一次1或者出现一次2-->
元素的定义如下:
<!--我们拿一个表单来举例吧-->
<!ELEMENT form (name,sex,birthday,home,hobby*,studyPlace|workPlace)>
<!ELEMENT name (#CDATA)>
<!ELEMENT sex (#CDATA)>
<!ELEMENT birthday (#CDATA)>
<!ELEMENT home (#CDATA)>
<!ELEMENT hobby (#CDATA)>
<!ELEMENT studyPlace (#CDATA)>
<!ELEMENT workPlace (#CDATA)>
属性
属性的声明规则如下:
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
<!ATTLIST 元素名称 属性名称 属性类型 #IMPLIED>
属性类型选项:
类型 描述 CDATA character data (a|b|c|....) 此值是列表中的一个值 ID 值为唯一的id IDREF 值为另一个元素的id IDREFS 值为其他id的列表 NMTOKEN 值为合法的XML名称 NMTOKENS 值为合法的XML名称的列表 ENTITY 值是一个实体 ENTITIES 值是一个实体列表 NOTATION 此值是符号的名称 xml: 值是一个预定义的xml值 默认值参数:
值 解释 #REQUIRED 值是必须的 #IMPLIED 值不是必须的 #FIXED value 值是固定的value
实体
<!ENTITY 实体名称 "实体的值">
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
<author>&writer;©right;</author>
XML Schema
XML Schema
是基于xml
的DTD
替代者,也是用来描述xml
文档结构的。它可以作为XSD
来引用。spring
的xml
配置文件很多引用的就是.xsd
文件。
XML Schema和DTD相比有很多优点:xml Schema是基于xml语言的,开发者不需要新学语言,可以直接使用xml的编辑器、解释进行操作
XSD 基本知识
schema声明
XSD的根元素是<schema>
标签,一个schema声明看上去类似这样:
<?xml version="1.0"?>
<xs:schema xmlns:xs="A"
targetNamespace="B"
xmlns="C"
elementFormDefault="qualified">
...
...
</xs:schema>
解释如下:
- 本XSD文件xs前缀对应的命名空间是A URI
- 被此XSD定义的元素来自命名空间B URI
- 默认的命名空间是 C URI
- 任何XML实例文档所使用的且在此schema种声明过的元素必须被命名空间限定
在xml中引用schema
在xml中引用xml schema
<?xml version="1.0"?>
<note xmlns="http://www.w3school.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3school.com.cn note.xsd">
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
代码解释
xmlns="http://www.w3school.com.cn"
默认命名空间是这个URI
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
加了xsi前缀的元素/属性的命名空间是这个URI,加这个是为了能使用下面的schemaLocation
属性。
xsi:schemaLocation="http://www.w3school.com.cn note.xsd"
此属性有两个值,一个是需要使用的命名空间,第二个值是提供命名空间使用的xml schema的位置
XSD 简单类型
XSD 元素
XSD元素的定义如下:
<xs:element name="xxx" type="yyy"/>
这里定义的都是简单的元素,又叫简易元素,它仅包含文本,不包含其他元素或者属性。文本指的是常见类型或者个人自定义类型。
其中type有以下值:
- xs:string
- xs:decimal
- xs:integer
- xs:boolean
- xs:date
- xs:time
简易元素还可以加其他的限制:
<xs:element name="名称" type="类型" default="默认值" />
<xs:element name="名称" type="类型" fixed="固定值">
XSD 属性
属性定义语句如下:
<xs:attribute name="属性名" type="属性类型" default="默认值"/>
<xs:attribute name="属性名" type="属性类型" fixed="固定值"/>
属性类型和上面元素类型的取值范围一样。
XSD 限定
restriction
用于为xml元素/属性定义可接受的值。
对值的限定
<xs:element name="age">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="120"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
对一组值的限定
<xs:element name="car">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="car" type="carType"/>
<xs:simpleType name="carType"><!--这样限定就可以被其他元素复用了-->
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>
正则表达式的限定
<xs:element name="letter">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-z]"/><!--正则表达式的东西-->
</xs:restriction>
</xs:simpleType>
</xs:element>
对空白字符的限定
<xs:element name="address">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
preserve 表示对元素值中的空格、回车、换行、制表符进行保留处理。
<xs:element name="address">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="replace"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
replace 表示对元素值中的空格、回车、换行、制表符进行移除处理
<xs:element name="address">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
collapse 表示将所有的空白字符替换成一个空格【连续的多个空格也换成一个空格】
对长度的限定
xs:element name="password">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="8"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="password">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="5"/>
<xs:maxLength value="8"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
数据类型限定
限定 | 描述 |
---|---|
enumeration | 定义可接受值的列表 |
fractuinDigits | 定义可接受的最大的小数位数 |
length | 定义所允许的字符或者列表项目的精确数目 |
maxExclusive | 定义数值上线,不包括 |
minExclusive | 定义数值下线,不包括 |
maxInclusive | 定义数值上线,包括 |
minInclusive | 定义数值下线,包括 |
maxLength | 定义所允许的字符或者列表项目的最大数目 |
minLength | 定义所允许的字符或者列表项目的最小数目 |
pattern | 定义可接受的正则表达式 |
totalDigits | 定义所允许的阿拉伯数字的精确位数 |
whithSpace | 定义空白字符的处理方式 |
XSD 复杂类型
复合元素指的是包含其他元素/属性的xml元素
复合元素类型:
- 空元素
- 包含其他元素的元素
- 仅包含文本的元素
- 包含元素和文本的元素
复杂类型元素
<xs:element name="employee">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!--下面的可以复用-->
<xs:element name="employee" type="personinfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<!--也可以继续扩展-->
<xs:element name="employee" type="fullpersoninfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="fullpersoninfo">
<xs:complexContent>
<xs:extension base="personinfo">
<xs:sequence>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
混合内容、指示器
有七种指示器:
Order 指示器:【规定元素出现次序】
- All【任意次序、但都出现一次】
- Choice【n选1】
- Sequence【按顺序、都出现一次】
<xs:element name="person">
<xs:complexType>
<xs:all>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="person">
<xs:complexType>
<xs:choice>
<xs:element name="employee" type="employee"/>
<xs:element name="member" type="member"/>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Occurrence 指示器:【规定元素出现频率】
- maxOccurs
- minOccurs
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="full_name" type="xs:string"/>
<xs:element name="child_name" type="xs:string" maxOccurs="10"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="full_name" type="xs:string"/>
<xs:element name="child_name" type="xs:string"
maxOccurs="10" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Group 指示器:【批量定义元素】
- Group name【定义元素】
- attributeGroup name【定义属性】
<xs:group name="persongroup">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
<xs:element name="birthday" type="xs:date"/>
</xs:sequence>
</xs:group>
<xs:attributeGroup name="personattrgroup">
<xs:attribute name="firstname" type="xs:string"/>
<xs:attribute name="lastname" type="xs:string"/>
<xs:attribute name="birthday" type="xs:date"/>
</xs:attributeGroup>
网友评论