Как импортировать схему XML в «пространство имен без» - PullRequest
4 голосов
/ 23 августа 2010

У меня есть схема, в которой я пытаюсь включить / импортировать другую схему, у которой нет пространства имен (и ее нельзя изменить, поскольку она исходит от другого поставщика и она больше не будет проверять их XML).Вот первая Схема:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:samp="http://sample/namespace" 
targetNamespace="http://sample/namespace" 
elementFormDefault="unqualified" attributeFormDefault="unqualified"
xmlns:otr1="http://sample/import/namespace1" 
xmlns:otr2="http://sample/import/namespace2">

<xs:import namespace="http://sample/import/namespace1" schemaLocation="other1.xsd" />
<xs:import namespace="http://sample/import/namespace2" schemaLocation="other2.xsd"  />
<!-- This one below is having problems, it is valid XML, and I am able to use it
but I am not meeting the actual requirments I have (explained later) -->
<xs:include schemaLocation=="NO_NAME_SPACE_PROBLEM.xsd"/>

...
<xs:element ref="some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA"/>
...


</xs:schema>

И «NO_NAME_SPACE_SHEMA_PROBLEM.xsd», который может быть изменен до некоторой степени, но не может иметь пространства имен.some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA помещается в пространство имен samp.Поэтому, когда я пытаюсь выполнить маршалинг этого в XML, он выводит <samp:some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA><child-elem/></samp:some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA>, что является большой проблемой, потому что этот XML не будет проверяться, поскольку он не предназначен для этого.Поэтому моя цель - просто импортировать элементы в пространство имен без пространства имен.

Обновление 1 : извините за путаницу, я использовал и использую xs: include, а не xs: import длясхема без пространства имен.Синтаксис вопроса был обновлен.Я также использую коден JiBX для генерации объектов домена и привязку JiBX для маршалинга.Так что это должно быть JiBX-совместимым тоже.

Обновление 2 : Согласно ответу Скаффмана, теперь я буду использовать xs: import.Я думаю, что я добавлю это в новый вопрос.

1 Ответ

3 голосов
/ 23 августа 2010

Вы пробовали

<xs:import namespace="" schemaLocation="NO_NAME_SPACE_PROBLEM.xsd"/>

Интересно, что спецификация XML-схемы настоятельно рекомендует , что

<xs:import schemaLocation="NO_NAME_SPACE_PROBLEM.xsd"/>

должен импортировать NO_NAME_SPACE_PROBLEM.xsd в "пространство имен без". Если ваша среда вместо этого импортирует его в пространство имен документа схемы, то я почти уверен, что это ошибка в вашей платформе.


update : ОК, ваше обновление говорит, что вы пытаетесь использовать <xs:include> для ссылки на типы в другом пространстве имен. Вы не можете сделать это - <xs:include> всегда переносит включенные элементы в то же пространство имен, что и документ родительской схемы. Если они для другого пространства имен, вы должны использовать <xs:import>.

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

<xs:element ref="nn:some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA"/>

Попробуйте добавить атрибут xmlns:nn="" в родительский документ схемы, посмотрите, работает ли он.

...