如何为 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 的某处。