XML基础
|
符号 | 出现次数 |
---|---|
+ |
一次或者多次 |
* |
零次或者多次 |
? |
零次或者一次 |
<!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 教程.
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!