Schema学习
程序员文章站
2022-04-24 15:41:24
...
1.Schema介绍
XML Schema 是基于 XML 的 DTD 替代者。可描述 XML 文档的结构。
XML Schema 语言也可作为 XSD(XML Schema Definition)来引用。
XML Schema 本身也是一种XML构造,它用来描述[哪个元素,在什么时候出现],[该元素具有什么样的属性]等等,也就是说,XML Schema是对XML的树形构造加以描述说明的一种语言。
原本,使用DTD对XML的树形构造加以描述说明,但DTD存在严重的局限性,DTD不能定义数据的类型,语法也与XML语言完全不一样,在使用的便利性,数据结构表达的严谨性上存在问题。
2.什么是Schema
XML Schema是用一套预先规定的XML元素和属性创建的,这些元素和属性定义了XML文档结构和内容模式。
XML Schema规定XML文档实例的结构和每个元素/属性的数据类型。
3.初始Schema
<?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="hello" type="xsd:string"> </xs:schema>讲解:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
其中xs是命名空间,schema是根节点名。
注意xs:schema与xmlns:xs中的xs要完全一样(名称可以任意,只要一样就可以)。
<xs:element name="hello" type="xs:string">
name是用来定义它所描述的XML文档中的节点名。
type是表示该节点的值的类型。
4.Schema的数据类型
简单数据类型:
1)内置的数据类型:基本数据类型和扩展数据类型
2)用户自定义的数据类型(通过dataType定义)
复杂数据类型:
常用数据类型:xs:string 、xs:decimal 、xs:integer 、xs:boolean 、xs:date 、xs:time
5.元素介绍
-
schema元素
-
element元素
-
attribute元素
-
group元素
-
attributeGroup元素
-
simpleType元素
-
simpleContent元素
-
complexType元素
-
choice元素
-
list元素
-
union元素
-
sequence元素
-
restriction元素
这些元素的具体说明请参考附件《Schema读书笔记》或查看http://www.w3school.com.cn/schema/
6.基于Spring可扩展Schema提供自定义配置
扩展XML配置大致需要一下几个步骤:
- 创建一个需要扩展的组件
- 定义一个xsd文件描述组件内容
- 实现BeanDefinitionParser接口,用来解析xsd文件中的定义和组件定义
- 扩展自NamespaceHandlerSupport,目的是将组件注册到Spring容器
- 编写spring.handlers和spring.schemas文件
6.1创建一个需要扩展的组件
创建一个需要扩展的组件,在这里只是一个简单的bean,而且这个bean有id和age俩个属性。
public class TagOne { private String id; private String age; //set和get方法,此处略去 }
6.2定义一个xsd文件
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns="http://www.mysite.org/schema/mytag" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.mysite.org/schema/mytag"> <xsd:import namespace="http://www.w3.org/XML/1998/namespace"/> <xsd:element name="tagOne" type="identifiedType"/> <xsd:complexType name="identifiedType"> <xsd:attribute name="id" type="xsd:string"/> <xsd:attribute name="age" type="xsd:string"/> </xsd:complexType> </xsd:schema>
6.3实现BeanDefinitionParser接口
public class MyBeanDefinitionParser implements BeanDefinitionParser{ public BeanDefinition parse(Element arg0, ParserContext arg1) { RootBeanDefinition def = new RootBeanDefinition(); //设置Bean Class def.setBeanClass(TagOne.class); //注册ID属性 String id = arg0.getAttribute("id"); BeanDefinitionHolder idHolder= new BeanDefinitionHolder(def,id); BeanDefinitionReaderUtils.registerBeanDefinition(idHolder, arg1.getRegistry()); //注册age属性 String age = arg0.getAttribute("age"); BeanDefinitionHolder ageHolder= new BeanDefinitionHolder(def,age); BeanDefinitionReaderUtils.registerBeanDefinition(ageHolder, arg1.getRegistry()); def.getPropertyValues().addPropertyValue("age", age); return def; } }给bean的属性赋值,这个是不可缺少的,否则在使用标签定义时将无法获取bean属性的值。
6.4扩展自NamespaceHandlerSupport
public class MyNameSpaceHandler extends NamespaceHandlerSupport { public void init() { registerBeanDefinitionParser("tagOne",new MyBeanDefinitionParser()); } }
6.5编写spring.handlers和spring.schemas文件
由于spring无法找到我们在什么地方定义了哪些标签,所以需要在spring.handlers和spring.schemas进行配置并存放在META-INF目录中。
在Spring.jar的META-INF目录中也有同名的文件,它们的文件内容基本上是相似的,而Spring在执行过程中,如果发现其他jar文件的META-INF文件夹中包含有这两个文件,Spring将会合并它们。
spring.schemas http\://www.mysite.org/schema/mytag.xsd=com/mysite/tag/mytag.xsd spring.handlers http\://www.mysite.org/schema/mytag=com.mysite.tag.MyNameSpaceHandler
7.测试运行
1、将整个项目打包成jar文件(别忘记META-INF内的两个文件)
2、新建一个项目,引用刚才打包的jar文件,并引用Spring相关文件
3、测试运行
spring配置文件:
<?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:tag="http://www.mysite.org/schema/mytag" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.mysite.org/schema/mytag http://www.mysite.org/schema/mytag.xsd"> <tag:tagOne id="oneBean" age="99"/> </beans>测试类:
public class Main { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml"); TagOne tag = (TagOne) ctx.getBean("oneBean"); System.out.println("oneBean age is "+tag.getAge()); } }输出结果:
oneBean age is 99
ps:我ide用的是Intellij IDEA,介绍个博文,是Intellij IDEA中生成jar包的操作。
http://blog.csdn.net/eastgrand/article/details/11945309