Schema学习

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lanjian056/article/details/52711312

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
  • a04210f3-10a0-3321-8d14-6d011b6d4877-thumb.png
  • 大小: 17.7 KB

猜你喜欢

转载自blog.csdn.net/lanjian056/article/details/52711312