XML基础
2016-01-18 15:36
459 查看
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 教程.
相关文章推荐
- XML基础
- Xamarin应用商店最受欢迎的10款免费用户界面工具
- leetcode总结-- 排序算法(内部排序)
- AndroidJNI 通过C/C++调用JAVA
- Bootstrap面包屑导航、分页、标签、徽章
- java通用日期转换(string 转 date)
- Spring配置文件中的 default-lazy-init="true"
- Linux meld安装
- 【人脸识别】初识人脸识别
- Prison Jamming system remote control by PC
- PCFI
- java入门学习(10)—抽象类
- <context:component-scan>使用说明
- I/O端口的访问
- Java细节之static方法重写
- ListView布局之View复用原理举例
- 已经完成的习惯
- 读取固定ResourceBundle
- Windows下移动MariaDB数据目录 (转!)
- vb 定时执行php程序