Какое пространство имен XML следует использовать, когда на сложный тип ссылается другая схема в другом пространстве имен? - PullRequest
2 голосов
/ 05 ноября 2010

Допустим, у меня есть одна схема, которая определяет сложный тип с именем "MyType" в пространстве имен "general"

Затем в другой схеме используется этот сложный тип.

Например:

<xsd:schema targetNamespace="http://www.example.com/otherschema" 
          xmlns:general="http://www.example.com/genschema">
<xsd:import namespace="http://www.example.com/genschema" schemaLocation="general.xsd" />
<xsd:element ref="general:Mytype" />
<xsd:element name="myName" type="general:MyType" />

Если пространство имен в элементе XML в документе XML, которое соответствует этой схеме, использует targetNamespace для других схем или геншем.

<general:MyType />
or
<targetNamespacePrefix:Mytype />

Я задаю этот вопрос, потому что я использовал Axis2 для генерации Java-кода для взаимодействия с веб-сервисом. Код Axis2 проверяет пространство имен, и в приведенном выше примере он проверяет, является ли пространство имен общим, и выдает исключение, если это не так. Конечно, XML-ответ веб-службы использовал пространство имен targetName вместо общего пространства имен, поэтому оно каждый раз прерывается. Я гораздо больше верю разработчикам Axis2, чем разработчикам веб-службы, но я хочу убедиться, что я пишу, прежде чем отправлять отчет об ошибке.

1 Ответ

0 голосов
/ 21 мая 2011

Вы используете MyType в «другой» схеме правильно: объявите пространство имен, используйте import и используйте объявленный префикс (general).

<xsd:schema targetNamespace="http://www.example.com/otherschema" 
              xmlns:general="http://www.example.com/genschema">
    <xsd:import namespace="http://www.example.com/genschema" schemaLocation="general.xsd" />
    <xsd:element name="myName" type="general:MyType" />
</xsd>

Обратите внимание, что я сделал ваш http://... пунктов ясно, чтобы понять, какие из них обычно отличаются в ситуации, которую вы описываете.

Если вы спрашиваете о схеме, где определено MyType, используйте без префикса имя для определения в этой схеме:

<xsd:schema targetNamespace="http://www.example.com/genschema" 
    <xsd:complexType name="MyType"> ... </xsd:complexType>
</xsd:schema>

Обновление на основе ваших изменений:

В экземпляре XML-документа использование myName будет иметь пространство имен "otherschema", которое является targetNamespace выше.Использование MyType будет использовать пространство имен "genschema".

Я удалил <xsd:element ref="general:MyType"/>, который имеет смысл, только если MyType является элементом (не типом) и если он находится внутри определения типа.Предположим, что «otherschema» содержит:

<xsd:complexType name="otherType>
    ...
    <xsd:element ref="general:MyElement"/>
</xsd:complexType>

В этом случае MyElement будет по-прежнему использовать пространство имен «genschema» в экземпляре документа XML.

Нижняя строка: импорт элементов не изменяетсяих пространство имен.Включение их, однако, меняет пространство имен (то есть, используя <xsd:include>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...