如何为 xsd:element 定义命名空间以覆盖默认的 targetNamespace
How to define namespace for xsd:element to override default targetNamespace
我正在尝试根据 xsd 模式验证 xml,而不是使用序列化到 Java 从我们使用 WSDL 到 Java 的 WSDL 文件派生的类型。
我们的最外层元素标签在 WSDL 中定义,但我们需要根据 xsd 架构进行验证,因此我们尝试将最外层元素标签添加到 xsd。但是,当最外层包装器包含一个与 xsd 文件的 targetNamespace 不同的名称空间时,xml 验证失败。
简化xml
<ns6:responseWrapper
xmlns="http://somewhere.com/types/2016/A"
xmlns:ns6="http://somewhere.com/operations/2016/A"
>
<user>
<id>the_id</id>
<someInfo>the_source</someInfo>
</user>
</ns6:responseWrapper>
简化架构
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://somewhere.com/types/2016/A"
targetNamespace="http://somewhere.com/types/2016/A"
elementFormDefault="qualified"
>
<xsd:element
xmlns:ns6="http://somewhere.com/operations/2016/A"
name="responseWrapper"
type="tns:ResponseWrapper"
/>
<xsd:complexType name="ResponseWrapper">
<xsd:element name="user" type="tns:User"/>
</xsd:complexType>
<xsd:complexType name="User">
<xsd:sequence>
<xsd:element name="id" type="xsd:string"/>
<xsd:element name="someInfo" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
上面的 xml 和架构生成 Cannot find the declaration of element 'ns6:responseWrapper` errors.
我想修改架构,以便 xml 成功验证。
一般来说,如果您在两个不同的命名空间中有元素,则需要在由 xs:import 链接的不同 XSD 模式文档中定义它们。
XSD 1.1 中有一个有限的例外允许您在局部元素声明中使用 targetNamespace 属性,但它有太多限制,我认为它不经常使用。
在 xs:element
声明上放置一个额外的命名空间声明,如 xmlns:ns6="http://somewhere.com/operations/2016/A"
是完全合法的,但对模式的含义绝对没有影响,除非实际使用了 ns6
前缀QName 的某处。
我正在尝试根据 xsd 模式验证 xml,而不是使用序列化到 Java 从我们使用 WSDL 到 Java 的 WSDL 文件派生的类型。
我们的最外层元素标签在 WSDL 中定义,但我们需要根据 xsd 架构进行验证,因此我们尝试将最外层元素标签添加到 xsd。但是,当最外层包装器包含一个与 xsd 文件的 targetNamespace 不同的名称空间时,xml 验证失败。
简化xml
<ns6:responseWrapper
xmlns="http://somewhere.com/types/2016/A"
xmlns:ns6="http://somewhere.com/operations/2016/A"
>
<user>
<id>the_id</id>
<someInfo>the_source</someInfo>
</user>
</ns6:responseWrapper>
简化架构
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://somewhere.com/types/2016/A"
targetNamespace="http://somewhere.com/types/2016/A"
elementFormDefault="qualified"
>
<xsd:element
xmlns:ns6="http://somewhere.com/operations/2016/A"
name="responseWrapper"
type="tns:ResponseWrapper"
/>
<xsd:complexType name="ResponseWrapper">
<xsd:element name="user" type="tns:User"/>
</xsd:complexType>
<xsd:complexType name="User">
<xsd:sequence>
<xsd:element name="id" type="xsd:string"/>
<xsd:element name="someInfo" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
上面的 xml 和架构生成 Cannot find the declaration of element 'ns6:responseWrapper` errors.
我想修改架构,以便 xml 成功验证。
一般来说,如果您在两个不同的命名空间中有元素,则需要在由 xs:import 链接的不同 XSD 模式文档中定义它们。
XSD 1.1 中有一个有限的例外允许您在局部元素声明中使用 targetNamespace 属性,但它有太多限制,我认为它不经常使用。
在 xs:element
声明上放置一个额外的命名空间声明,如 xmlns:ns6="http://somewhere.com/operations/2016/A"
是完全合法的,但对模式的含义绝对没有影响,除非实际使用了 ns6
前缀QName 的某处。