如何为xsd:element定义名称空间以覆盖默认的targetNamespace

时间:2019-04-10 20:51:06

标签: xml xsd xsd-validation

我试图针对xsd模式验证xml,而不是使用从WSDL到Java的序列化到从我们的WSDL文件派生的Java类型。

我们的最外面的元素标签是在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成功验证。

1 个答案:

答案 0 :(得分:1)

通常,如果元素在两个不同的命名空间中,则需要在由xs:import链接的不同XSD模式文档中定义它们。

XSD 1.1中有一个例外,它允许您在本地元素声明上使用targetNamespace属性,但是它有很多限制,以至于我认为它并不经常使用。

xmlns:ns6="http://somewhere.com/operations/2016/A"声明上放置一个额外的名称空间声明,例如xs:element是完全合法的,但对架构的含义绝对没有影响,除非ns6前缀实际上在一个QName。