xml约束(DTD约束,Schema约束)

在XML技术里,可以通过约束文档,来约束XML文档的书写规范,这称之为XML约束。
常见的xml约束有:DTD、Schema

W3C提供了官方约束文档
通过官方文档,我们可以创建自定义约束文档
通过提供的 自定义约束文档,可以编写符合限定条件的xml文档。

DTD约束:
DTD(Document Type Definition),文档类型定义,用来约束XML文档的书写。规定了XML文档中可书写的元素名称,子元素的名称及顺序,元素的属性等。

注意: 通常情况都是通过框架(开发团队)提供的DTD约束文档,编写对应的XML文档。常见框架使用DTD约束有:struts2、hibernate等。

通过DTD约束文档编写对应的xml文档:

<?xml version="1.0" encoding="UTF-8"?>
<!--
	如果需要在xml使用当前DTD约束,必须包括DOCTYPE。
	格式如下:
	<!DOCTYPE beans SYSTEM "bean.dtd">
-->

<!--
	<!ELEMENT 元素名称 (元素内容)> : 声明一个元素 
	元素名称: beans、bean、property、import
	元素内容:
		(bean*,import*) 代表元素内容为 多个bean元素、多个import元素
			其中 bean* :代表bean元素允许出现0次或多次
			其中 import* :代表import元素允许出现0次或多次
		(property*): 代表元素内容为 多个property元素
			其中 property*:代表property元素允许出现0次或多次
		(#PCDATA):代表元素内容为 文本
			PCDATA,指的是可被解析的字符数据(Parsed Character Data)
			当某个 XML 元素被解析时,其标签之间的文本也会被解析
			<message>此文本也会被解析</message>
-->
<!ELEMENT beans (bean*,import*) >

<!ELEMENT bean (property*)>
<!ELEMENT property (#PCDATA)>
<!ELEMENT import (#PCDATA)>

<!-- 
	<!ATTLIST 元素名称 属性名称 属性类型 默认值>: 声明一个属性
	元素名称:bean
	属性名称:id、className、type
	属性类型:CDATA
		CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)。
		CDATA 部分中的所有内容都会被解析器忽略,进行原样输出
		CDATA 格式:<![CDATA[原样输出的数据]]>
	默认值:默认值参数可使用下列值
		"值",指定属性默认的值,当属性没有赋值时,使用该默认值
		#REQUIRED,属性值是必需填写的
		#IMPLIED,属性不是必需的, 可以不编写
		#FIXED value,属性值是固定的,为指定的value值
-->
<!ATTLIST bean id CDATA #REQUIRED
        className CDATA #REQUIRED
        type CDATA #IMPLIED
        >

<!ATTLIST property name CDATA #REQUIRED
        value CDATA #REQUIRED
        >

<!ATTLIST import resource CDATA #REQUIRED>

xml内容编写

<?xml version="1.0" encoding="utf-8" ?>
<!--
 	DTD约束文件 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中
	<!DOCTYPE 根元素 SYSTEM "文件名">
	根元素:beans
	SYSTEM:固定值,代表DTD约束文件在本地系统上
	"文件名":bean.dtd, 代表DTD约束文件的路径
-->
<!DOCTYPE beans SYSTEM "bean.dtd">
<beans>
    <bean id="" className="" type="">
        <property name="" value="">文本</property>
        <property name="" value="">文本</property>
    </bean>

    <bean id="" className="">
        <property name="" value="">文本</property>
        <property name="" value="">文本</property>
    </bean>

    <import resource="">文本</import>
    <import resource="">文本</import>

</beans>

Schema约束

什么是Schema约束?

Schema是新的XML文档约束;
Schema要比DTD强大很多,是DTD 替代者;
Schema本身也是XML文档,但Schema文档的扩展名为xsd,而不是xml。
Schema 功能更强大,数据类型更完善
Schema 支持名称空间

XML Schema 约束的作用

  • 定义可出现在XML文档中的元素
  • 定义可出现在XML文档中的属性
  • 定义哪个元素是子元素
  • 定义子元素的次序
  • 定义子元素的数目
  • 定义元素是否为空,或者是否可包含文本
  • 定义元素和属性的数据类型
  • 定义元素和属性的默认值以及固定值

Schema与DTD一样,可以通过schema约束文档编写xml文档,常见的框架使用schema的如Spring等。

通过提供编写xml文档

<?xml version="1.0" encoding="UTF-8"?>
<!--
	如果开发人员需要在xml使用当前Schema约束,必须包括指定命名空间。
	格式如下:
	<beans xmlns="http://www.hahaha.com/bean"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xsi:schemaLocation="http://www.hahaha.com/bean bean-schema.xsd"
	>
-->

<!-- 
xmlns="http://www.w3.org/2001/XMLSchema"
表示 bean-schema.xsd 中用到的元素和数据类型来自命名空间"http://www.w3.org/2001/XMLSchema"。

targetNamespace="http://www.hahaha.com/bean"
表示 当前约束文档bean-schema.xsd 在网络中的唯一标识(命名空间), 命名空间的值是唯一的,不可重复 

elementFormDefault="qualified"
表示 引用bean-schema.xsd约束文档的 任何XML文档所使用的元素,必须是在此 bean-schema.xsd 中声明过的,没声明过的元素不可使用
-->
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.hahaha.com/bean"
        elementFormDefault="qualified">
    <!-- 声明根标签 -->
    <element name="beans">
        <!-- complexType 复杂的类型,代表里面有子元素 -->
        <complexType>
            <!-- 
				<choice> 规定可出现某个子元素或者可出现另外一个子元素(非此即彼):
				<minOccurs> 规定某个元素能够出现的最小次数
				<maxOccurs> 规定某个元素可出现的最大次数
				如需使某个元素的出现次数不受限制,请使用 maxOccurs="unbounded" 这个声明
 			-->
            <choice minOccurs="0" maxOccurs="unbounded">
                <element name="bean">
                    <complexType>
                        <!-- <sequence> 规定子元素必须按照特定的顺序出现 -->
                        <sequence minOccurs="0" maxOccurs="unbounded">
                            <element name="property">
                                <complexType>
                                    <attribute name="name" use="required"></attribute>
                                    <attribute name="value" use="required"></attribute>
                                </complexType>
                            </element>
                        </sequence>
                        <attribute name="id" use="required"></attribute>
                        <attribute name="className" use="required"></attribute>
                    </complexType>
                </element>
                <element name="import">
                    <complexType>
                        <attribute name="resource" use="required"></attribute>
                    </complexType>
                </element>
            </choice>
        </complexType>
    </element>
</schema>

使用schema约束文档的xml文档编写

<?xml version="1.0" encoding="UTF-8"?>
<!-- 
xmlns="http://www.hahaha.com/bean"
	xmlns: 指定要使用的schema约束文档的命名空间
	值:写成要使用的schema约束文档中的 targetNamespace 属性值

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	告知XML解析器,这是符合 XMLSchema约束标准的 XML文档。
	
xsi:schemaLocation="http://www.hahaha.com/bean bean-schema.xsd"
	告知XML解析器, 满足官方XMLSchema约束标准的 Schema约束文档的位置
    (在这里,它与当前XML文件处于相同的文件夹)。
-->
<beans xmlns="http://www.hahaha.com/bean"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.hahaha.com/bean bean-schema.xsd">

    <bean id="" className=""></bean>
    <bean id="" className=""></bean>

    <import resource=""></import>
    <import resource=""></import>
</beans>

命名空间(语法)

什么是命名空间?

如果一个XML文档中使用多个Schema文件,而这些Schema文件中定义了相同名称的元素时就会出现名字冲突。这就像一个Java文件中,在使用Date类时,那么就不明确Date是哪个包下的Date了。

java.util.Date; // JDK提供的日期类, 用于表示与操作系统的日期相对应
java.sql.Date; // JDK提供的日期类, 用于表示与数据库中的日期相对应

名称空间就是用来处理元素和属性的名称冲突问题,与Java中的包是同一用途。如果每个元素和属性都有自己的名称空间,那么就不会出现名字冲突问题,就像是每个类都有自己所在的包一样,那么类名就不会出现冲突。

默认命名空间的格式:<xmlns=””>,使用格式:<标签>
显式命名空间的格式:xmlns:别名=””,使用格式:<别名:标签>

使用显示命名空间

需要导入jar包:
spring-beans-5.0.5.RELEASE.jar
spring-context-5.0.5.RELEASE.jar
spring-webmvc-5.0.5.RELEASE.jar

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    					http://www.springframework.org/schema/beans/spring-beans.xsd
    					http://www.springframework.org/schema/mvc
    					http://www.springframework.org/schema/mvc/spring-mvc.xsd
    					http://www.springframework.org/schema/context
    					http://www.springframework.org/schema/context/spring-context.xsd">
	
	<!-- 定义controller扫描包 -->
	<context:component-scan base-package="com.example.controller" />
	<mvc:annotation-driven />
	<!-- 处理静态资源 -->
	<mvc:default-servlet-handler/>
	<!-- 配置视图解析器 -->
	<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	   <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
	   <property name="prefix" value="/WEB-INF/jsp/"/>
	   <property name="suffix" value=".jsp"/>
 	</bean>
	
</beans>

注意事项:

  • 一个xml文件中, 可以出现多个xmlns:别名, 来表示引用不同的命名空间规范, 例如xmlns:mvc="http://www.springframework.org/schema/mvc"
  • 使用命名空间中所指定的标签时: 需要通过别名:标签的方式来使用, 例如<mvc:annotation-driven />
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值