Пространства имен XML и проверка - PullRequest
1 голос
/ 21 февраля 2012

сегодня я столкнулся со следующей проблемой.У меня есть следующий XML:

<c:docschema xmlns:c="http://www.otr.ru/sufd/document/desc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.otr.ru/sufd/document/desc http://otr-sufd/xmlschema/docschema.xsd">
   ...
</c:docschema>

И он проверяет FINA против его схемы.Но мне не нужны префиксы пространств имен в моем xml, поэтому я пытаюсь написать это так:

<docschema xmlns="http://www.otr.ru/sufd/document/desc"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.otr.ru/sufd/document/desc http://otr-sufd/xmlschema/docschema.xsd">
       ...
</docschema>

И это дает мне ошибку проверки.Моя XSD-схема, с которой я проверяю, представляет собой соединение двух XSD, вот заголовки:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        attributeFormDefault="unqualified"
        elementFormDefault="unqualified"
        xmlns="http://www.otr.ru/sufd/document/desc"
        targetNamespace="http://www.otr.ru/sufd/document/desc"
        xmlns:fieldset="http://www.otr.ru/sufd/document/fieldset"
        xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore">


<xsd:import namespace="http://www.otr.ru/sufd/document/fieldset" schemaLocation="fieldset.xsd"/>

и

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        attributeFormDefault="unqualified"
        elementFormDefault="unqualified"
        targetNamespace="http://www.otr.ru/sufd/document/fieldset"
        xmlns="http://www.otr.ru/sufd/document/fieldset">

Что там не так?

РЕДАКТИРОВАТЬ: Теперь вопрос в том, как изменить мой XSD, чтобы сделать документ экземпляра действительным?

Ответы [ 2 ]

3 голосов
/ 21 февраля 2012

Учитывая то, что вы пишете, я думаю, что проблема заключается в следующем.

Давайте рассмотрим, что есть элемент a под вашим корневым элементом.

Этот первый пример ниже действителен, потому что a неквалифицирован и потому что вы установили elementFormDefault в unqualified:

Первый пример

<c:docschema xmlns:c="http://www.otr.ru/sufd/document/desc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.otr.ru/sufd/document/desc http://otr-sufd/xmlschema/docschema.xsd">
   <a>...</a>
</c:docschema>

Во втором примере файл недействителен, потому что вы установили elementFormDefault на unqualified, и у вас есть элемент a, который квалифицирован (в пространстве имен по умолчанию):

Второй пример

<docschema xmlns="http://www.otr.ru/sufd/document/desc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.otr.ru/sufd/document/desc http://otr-sufd/xmlschema/docschema.xsd">
   <a>...</a>
</docschema>

Правильный XML может быть:

<docschema xmlns="http://www.otr.ru/sufd/document/desc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.otr.ru/sufd/document/desc http://otr-sufd/xmlschema/docschema.xsd">
   <a xmlns="">...</a>
</docschema>

EDIT

Если дочерние элементы корневого элемента определены в том же пространстве имен, что и корневой в ваших схемах, вам просто нужно изменить elementFormDefault="unqualified" на elementFormDefault="qualified", чтобы иметь схему, которая проверяет XML. Если это не так: вам наверняка придется изменить свою схему более глубоко, в этом случае, возможно, вам следует опубликовать еще один вопрос, посвященный этому вопросу, с большим количеством кода (включая большую часть схем и экземпляров).

0 голосов
/ 21 февраля 2012

Похоже, вы делаете ошибку, предполагая, что вложенные элементы внутри вашего корня <docschema> будут наследовать пространство имен, определенное в этом корне.Они не будут.

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

Например,

<Root xmlns="http://www.myns.com">
  <MyElement1 xmlns="http://www.myns.com">
  ... etc
  </MyElement1>
</Root>

или

<p:Root xmlns:p="http://www.myns.com">
  <p:MyElement1>
  ... etc
  </p:MyElement1>
</p:Root>

Что лучше?Я думаю, что второй вариант.

...