欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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


Schema学习
            
    
    博客分类: schema Schemaxml 

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
  • Schema学习
            
    
    博客分类: schema Schemaxml 
  • 大小: 17.7 KB
相关标签: Schema xml