您的位置:首页 > 其它

XML基础

2016-01-18 15:36 363 查看

XML基础

标签 : Java基础

XML简介

XML(eXtensible Markup Language:可扩展标记型语言)被设计用来传输和存储数据,可扩展说明标签可以自定义(还可以定义中文标签
<猫></猫>
),XML有1.0/1.1两个版本,但一般使用都是1.0版本(由于1.1版本不能向下兼容).

<?xml version="1.0" encoding="UTF-8"?>


XML用于传输/存储数据

不同的系统之间传输数据,如IM之间数据的传输;

用来表示有层级关系的数据:



经常用在文件配置, 如Spring, MyBatis的配置文件(比如将数据库信息都放到配置文件中,如果需要修改数据库配置,并不需要修改源代码,只修改XML配置文件即可)

XML语法

XML文档声明

<?xml version="1.0" encoding="UTF-8"?>


属性

version:xml的版本 1.0

encoding:xml编码 utf-8

standalone:是否需要依赖其他文件 yes/no

XML中文乱码原因:保存的编码和打开的编码不一致

XML定义元素/标签

有开始必须要有结束:
<person></person>


如果标签没有内容,可以在标签内结束:
<aa/>


标签可以嵌套:
<aa><bb></bb></aa>


一个XML文件中,有且仅有一个
根标签
(其他标签都是根标签的子标签)

在XML中把空格和换行都当成内容来解析,下面这两段代码含义是不一样的:

<name>翡青</name>


<name>
翡青
</name>


标签命名规则

标签区分大小写;

标签可以是中文,但不能以数字和下划线开头, 也不能以xml、XML、Xml等开头;

标签不能包含空格和冒号;

XML定义属性

<name from="china" language="chinese">翡青</name>


属性定义规范

一个标签上可以有多个属性, 但多个属性名称不能相同

属性名称和属性值之间使用
=
,属性值使用引号括起来(单引号/双引号)

XML属性的命名规范和元素一致

XML注释

<!-- XML的注释 -->


注意: 注释不能嵌套

特殊字符与CDATA区

如果要在XML中书写特殊字符(如
<
),需要对其转义(如
$lt
), 规则同HTML.

如果有多个字符都需要进行转义,如

if (a > b && a < c) {
System.out.println("a is the biggest");
}


则可以将这些内容放到
CDATA
区中:

<![CDATA[
if (a > b && a < c) { System.out.println("a is the biggest"); }
]]>


CDATA区语法

<![CDATA[ 内容  ]]>


CDATA
区内的特殊字符被当做文本内容,而不是标签.

上面只是介绍了XML的常用语法, 详细内容介绍可以参考W3School XML 教程.

DTD约束

XML约束:规定XML中只能出现的元素以及元素的形式,包含
DTD
约束(如:MyBatis)和
Schema
约束(如:Spring)两种.

DTD开始

书写

<!ELEMENT person (name, age) >
<!ELEMENT name (#PCDATA) >
<!ELEMENT age (#PCDATA) >


引入

<!DOCTYPE person SYSTEM "constraint.dtd">


注: 如果想要校验XML约束,需要使用工具(比如IDEA),浏览器只负责校验XML语法,不负责校验约束.

DTD三种引入方式

引入本地dtd文件

<!DOCTYPE 根元素名称 SYSTEM "dtd路径">


引用内部的dtd文件(不推荐)

<!DOCTYPE person [
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>


引用网络dtd文件(最常用)

<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档URL">


MyBatis实例

MyBatis的
mapper
配置文件

<?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">


MyBatis的
config
配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">


DTD定义元素/标签

<!ELEMENT 元素(标签)名 约束>


简单元素(没有子元素的元素)

<!ELEMENT name (#PCDATA)>


属性:

(#PCDATA)
: 指定字符串类型

EMPTY
: 为空

ANY
: 任意,可以为空/也可以不为空

<!ELEMENT person (name, age, sex, school) >
<!ELEMENT name (#PCDATA) >
<!ELEMENT age (#PCDATA) >
<!ELEMENT sex EMPTY>
<!ELEMENT school ANY>


复杂元素

<!ELEMENT 元素名称 (子元素)>


默认子元素只能出现一次

符号出现次数
+
一次或者多次
*
零次或者多次
?
零次或者一次
<!ELEMENT person (name, school*) >
<!ELEMENT name (#PCDATA) >
<!ELEMENT school (#PCDATA)>


分隔符:

子元素直接使用
,
分隔,表示元素按顺序定义

子元素直接使用
|
分隔,表示元素只能出现其中的任意一个

<!ELEMENT person (name, sex | xingbie, school*) >
<!ELEMENT name (#PCDATA) >
<!ELEMENT sex (#PCDATA)>
<!ELEMENT xingbie (#PCDATA)>
<!ELEMENT school (#PCDATA)>


DTD定义属性

<!ATTLIST 元素(标签)名称
属性名称 属性类型 属性的约束
>


属性类型

属性解释
CDATA
字符串(常用)
枚举枚举值之一
ID
约定值只能以字母/下划线开头
<!ELEMENT person (name, school) >
<!ELEMENT name (#PCDATA) >
<!ELEMENT school (#PCDATA)>
<!ATTLIST school
where CDATA #REQUIRED
>


<!ELEMENT street (light) >
<!ELEMENT light (#PCDATA)>
<!ATTLIST light
color (red | green | yello) #REQUIRED
>


属性的约束

约束解释
#REQUIRED
属性必须存在(常用)
#IMPLIED
属性可有可无(常用)
#FIXED
表示一个固定值 #FIXED “AAA”, 属性的值必须是设置的这个固定值(不要与枚举类型一起用)
默认值如果没有在XML中定义该属性,则使用默认值
默认值

<!ELEMENT street (light) >
<!ELEMENT light (#PCDATA)>
<!ATTLIST light
color CDATA "YELLOW"
>


#FIXD
固定值

<!ELEMENT street (light) >
<!ELEMENT light (#PCDATA)>
<!ATTLIST light
color CDATA #FIXED "YELLOW"
>


DTD实例

模拟Spring约束

<!ELEMENT beans (bean*) >
<!ELEMENT bean (property*)>
<!ATTLIST bean
id CDATA #REQUIRED
class CDATA #REQUIRED
>

<!ELEMENT property EMPTY>
<!ATTLIST property
name CDATA #REQUIRED
value CDATA #IMPLIED
ref CDATA #IMPLIED>


根据DTD约束可以写出XML如下:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE beans SYSTEM "constraint.dtd">
<beans>
<bean id="id1" class="com.fq.domain.Bean">
<property name="isUsed" value="true"/>
</bean>
<bean id="id2" class="com.fq.domain.ComplexBean">
<property name="refBean" ref="id1"/>
</bean>
</beans>


在这里只对DTD做简单的介绍, 详细请参考W3School DTD 教程.

Schema约束

相比DTD约束, Schema更符合XML的语法,Schema直接使用XML语句.

一个XML文件只能有一个DTD,但可以有多个Schema(使用命名空间区分,类似Java包);

DTD里面只有
PCDATA
类型,但Schema可以支持更多的数据类型;

Schema语法更加复杂, 可以对XML做出更加细致的语意限制, 但Schema目前并未完全替代DTD.

Schema根标签

Schema文件的后缀名为
.xsd
, 根标签为
<schema>


<?xml version="1.0" encoding="utf-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.fq.me/context"
elementFormDefault="qualified">

</schema>


属性

xmlns="http://www.w3.org/2001/XMLSchema"


表示当前XSD是一个约束文件

targetNamespace="http://www.fq.me/context"


Schema命名空间,如果XML需要使用当前约束文件,需要通过这个地址引入该约束文件

elementFormDefault="qualified"


表明该Schema是质量良好的,所有全局元素的子元素将被以缺省方式放到目标命名空间;

Schema引入

<?xml version="1.0" encoding="utf-8"?>
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.fq.me/context"
xsi:schemaLocation="http://www.fq.me/context constraint.xsd">

</person>


xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"


表示当前XML是被约束的文件

xmlns="http://www.fq.me/context"


约束文档中的
targetNamespace


xsi:schemaLocation="http://www.fq.me/context constraint.xsd"


Schema约束文件的location:
targetNamespace
+
约束文件路径


Schema定义元素

简单元素

<element name="name" type="string"/>
<element name="age" type="int"/>
<element name="sex" type="boolean"/>


复杂元素

<element name="person">
<complexType>
<sequence>
<!-- 复杂元素的子元素(简单元素/复杂元素) -->
<element name="name" type="string"/> <element name="age" type="int"/> <element name="sex" type="boolean"/>
</sequence>
</complexType>
</element>


Schema定义属性

<element name="name" maxOccurs="unbounded">
<complexType>
<attribute name="from" type="string" use="required"/>
</complexType>
</element>


必须是复杂元素才能有属性(写在
<complexType></complexType>
中)

name: 属性名称

type:属性类型

use:属性是否必须出现

maxOccurs="unbounded"
表示元素可以出现任意次

Schema指示器

通过指示器,我们可以控制在文档中使用元素的方式.

指示器释义
<sequence>
必须按顺序出现
<all>
按照任意顺序出现, 但只能出现一次
<choice>
元素只能出现其中的一个
<element name="person">
<complexType>
<sequence>
<!-- 复杂元素的子元素 -->
<element name="name" maxOccurs="unbounded"/>
<choice>
<element name="from" type="string"/>
<element name="从哪儿来" type="string"/>
</choice>
</sequence>
</complexType>
</element>


XML命名空间

每个约束文档都可以被赋予唯一的命名空间,用一个URI表示;在书写XML时,可以通过命名空间声明当前编写的标签来自哪个Schema约束文档。如:

<?xml version="1.0" encoding="utf-8"?>
<context:beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.fq.me/context"
xsi:schemaLocation="http://www.fq.me/context constraint.xsd">
<context:bean id="id1" class="com.fq.benz">
<context:property name="name" ref="ref-bean"/>
</context:bean>
</context:beans>


此处使用
xmlns:context
来声明
context
是一个命名空间,后面对该命名空间的引用,都可以用
<context: ...>
.

命名空间的语法很容易让人混淆,尽管以
http://
开始,但并不指向一个文件,而只是一个分配的名字

一个命名空间的Schema文件具体位置,需要使用
schemaLocation
属性来指定:

<context:beans ...
xsi:schemaLocation="http://www.fq.me/context constraint1.xsd">


schemaLocation属性有两个值. a.命名空间;b.供命名空间使用的Schema位置(本地/网络).两者之间用空格分隔.

引入命名空间的作用是可以在一个XML文档中引入多个Schema约束.

Schema实例

模拟Spring约束

context.xsd

<?xml version="1.0" encoding="utf-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.fq.me/context"
elementFormDefault="qualified">
<element name="beans">
<complexType>
<sequence>
<element name="bean" maxOccurs="unbounded">
<complexType>
<sequence>
<element name="property" maxOccurs="unbounded">
<complexType>
<attribute name="name" type="string" use="required"/>
<attribute name="value" type="string" use="optional"/>
<attribute name="ref" type="string" use="optional"/>
</complexType>
</element>
</sequence>
<attribute name="id" type="string" use="required"/>
<attribute name="class" type="string" use="required"/>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>


config.xml

<?xml version="1.0" encoding="utf-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.fq.me/context"
xsi:schemaLocation="http://www.fq.me/context context.xsd">
<bean id="id1" class="com.fq.benz">
<property name="name" value="benz"/>
</bean>
<bean id="id2" class="com.fq.domain.Bean">
<property name="isUsed" value="true"/>
<property name="complexBean" ref="id1"/>
</bean>
</beans>


在这里只是对Schema做简单介绍, 详细内容可以参考W3School Schema 教程.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息