手记

Xml Schema Definition

使用自定义Xml Schema Definition(xsd)

  1. hello.xsd文件对hello.xml文件格式进行约束
<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://www.example.org/01">
    <xsd:element name="greeting" type="xsd:string"/>
</xsd:schema>
  • targetNamespace属性用来表示该xsd文件对哪个xmlns属性有效.
  • xsd:element name=“greeting” type="xsd:string"表示元素名greeting,内容为string类型.
  1. hello.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<greeting  xmlns="http://www.example.org/01"
		   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	       xsi:schemaLocation="http://www.example.org/01 file://hello.xsd绝对路径">
    Hello
</greeting>
  • xmlns="http://www.example.org/01"表示没有使用命名空间的元素,后面的url只是起到标识的作用,可以为任意值,但是要与xsd中的targetNamespace相对应.
  • xmlns:xsi,xsi:schemaLocation表示约束文件的实际位置.
  • xsi:schemaLocation格式为"xmlns标识 文件位置"

使用命名空间 Xml NameSpace

  • 当有多个xsd约束同一个元素时怎么区分呢? 这时就可以使用命名空间了
  • 格式xmlns:Namespace-prefix=“URI”
  • 比如再有一个hello-ext.xsd文件
<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://www.example.org/02">
    <xsd:element name="greeting">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="name" type="xsd:string"/>
                <xsd:element name="address" type="xsd:string"/>
                <xsd:any minOccurs="0"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>
  • 这两个文件都约束同一个元素greeting
  • 在hello.xml文件中使用该xsd
<?xml version="1.0" encoding="UTF-8" ?>
<g2:greeting
        xmlns:g1="http://www.example.org/01"
        xmlns:g2="http://www.example.org/02"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="
                            http://www.example.org/01
                            file://C:\Users\sicwen\Desktop\offerTest\src\main\java\com\offer\test\xml\hello.xsd
                            http://www.example.org/02
                            file://C:\Users\sicwen\Desktop\offerTest\src\main\java\com\offer\test\xml\hello-ext.xsd">
        <name>test</name>
        <address>China</address>
        <g1:greeting>
            这是第一个约束中的
        </g1:greeting>
</g2:greeting>
  • 使用xmlns:g1,xmln2:g2来区分不同的greeting.
  • 在spring中读取hello.xml时可以根据namespace获取到URI,根据URI来找到不同的NamespaceHandler,如MvcNamespaceHandler,ContextNamespaceHandler。然后在相应的NamespaceHandler(命名空间)中初始化注册(该命名空间中不同元素名的解析器)。
  • ContextNamespaceHandler
registerBeanDefinitionParser("property-placeholder", new PropertyPlaceholderBeanDefinitionParser());
registerBeanDefinitionParser("property-override", new PropertyOverrideBeanDefinitionParser());
registerBeanDefinitionParser("annotation-config", new AnnotationConfigBeanDefinitionParser());
registerBeanDefinitionParser("component-scan", new ComponentScanBeanDefinitionParser());
registerBeanDefinitionParser("load-time-weaver", new LoadTimeWeaverBeanDefinitionParser());
registerBeanDefinitionParser("spring-configured", new SpringConfiguredBeanDefinitionParser());
registerBeanDefinitionParser("mbean-export", new MBeanExportBeanDefinitionParser());
registerBeanDefinitionParser("mbean-server", new MBeanServerBeanDefinitionParser());
  • MvcNamespaceHandler
registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser());
registerBeanDefinitionParser("default-servlet-handler", new DefaultServletHandlerBeanDefinitionParser());
registerBeanDefinitionParser("interceptors", new InterceptorsBeanDefinitionParser());
registerBeanDefinitionParser("resources", new ResourcesBeanDefinitionParser());
registerBeanDefinitionParser("view-controller", new ViewControllerBeanDefinitionParser());
registerBeanDefinitionParser("redirect-view-controller", new ViewControllerBeanDefinitionParser());
registerBeanDefinitionParser("status-controller", new ViewControllerBeanDefinitionParser());
registerBeanDefinitionParser("view-resolvers", new ViewResolversBeanDefinitionParser());
registerBeanDefinitionParser("tiles-configurer", new TilesConfigurerBeanDefinitionParser());
registerBeanDefinitionParser("freemarker-configurer", new FreeMarkerConfigurerBeanDefinitionParser());
registerBeanDefinitionParser("groovy-configurer", new GroovyMarkupConfigurerBeanDefinitionParser());
registerBeanDefinitionParser("script-template-configurer", new ScriptTemplateConfigurerBeanDefinitionParser());
registerBeanDefinitionParser("cors", new CorsBeanDefinitionParser());
0人推荐
随时随地看视频
慕课网APP