Как определить пространство имен для элемента xsd: для переопределения по умолчанию targetNamespace - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь проверить xml по схеме xsd, а не использовать сериализацию в типы Java, полученные из нашего файла WSDL с использованием WSDL в Java.

Наши внешние теги элементов определены в WSDL, но нам нужно проверить соответствие схеме xsd, поэтому мы пытаемся добавить внешние теги элементов в xsd. Однако, когда внешняя оболочка включает пространство имен, которое отличается от targetNamespace файла xsd, 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 Ответ

1 голос
/ 11 апреля 2019

Как правило, если у вас есть элементы в двух разных пространствах имен, вам нужно определить их в разных документах схемы XSD, связанных с помощью xs: import.

В XSD 1.1 существует ограниченное исключение, позволяющее использоватьАтрибут targetNamespace в объявлении локального элемента, но он имеет так много ограничений, что я не думаю, что он часто используется.

Размещение дополнительной декларации пространства имен, такой как xmlns:ns6="http://somewhere.com/operations/2016/A", в объявлении xs:element совершенно законно, но абсолютно не влияет на смысл схемы, если только префикс ns6 фактически не используется где-то в QName.

...