冰狐
2019-01-30 17:02:04浏览 2205
使用自定义Xml Schema Definition(xsd)
- 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类型.
<?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());
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());