powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSD и namespace. Не могу пройти валидацию.
5 сообщений из 5, страница 1 из 1
XSD и namespace. Не могу пройти валидацию.
    #36545106
PlayerDN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть XML c таким содержанием:

Код: plaintext
1.
2.
3.
4.
<?xml version="1.0" encoding="utf-16"?>
<xsoDocument version="1.0" xmlns="xxx">
  <soPayload> 123 </soPayload>
</xsoDocument>

а вот схема к нему:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<?xml version="1.0"?>
<xsd:schema 	xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="xxx" targetNamespace="xxx">
  <xsd:element name="xsoDocument">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="soPayload" type="xsd:string" />
      </xsd:sequence>
      <xsd:attribute name="version" type ="xsd:string" use ="required"/>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

При валидации получается ошибка: "Элемент 'xsoDocument' в пространстве имен 'xxx' имеет недопустимый дочерний элемент 'soPayload' в пространстве имен 'xxx'. Список ожидаемых элементов: 'soPayload'.".

Чувствую что, что-то не так с пространствами имен, а что именно ХЗ. И в схеме и в экземпляре ХМЛ прописано пространство имен "ххх".

Спасибо за помощь.
...
Рейтинг: 0 / 0
XSD и namespace. Не могу пройти валидацию.
    #36545311
Edkonst2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PlayerDNЕсть XML c таким содержанием:

Код: plaintext
1.
2.
3.
4.
<?xml version="1.0" encoding="utf-16"?>
<xsoDocument version="1.0" xmlns="xxx">
  <soPayload> 123 </soPayload>
</xsoDocument>

а вот схема к нему:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<?xml version="1.0"?>
<xsd:schema 	xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="xxx" targetNamespace="xxx">
  <xsd:element name="xsoDocument">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="soPayload" type="xsd:string" />
      </xsd:sequence>
      <xsd:attribute name="version" type ="xsd:string" use ="required"/>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

При валидации получается ошибка: "Элемент 'xsoDocument' в пространстве имен 'xxx' имеет недопустимый дочерний элемент 'soPayload' в пространстве имен 'xxx'. Список ожидаемых элементов: 'soPayload'.".

Чувствую что, что-то не так с пространствами имен, а что именно ХЗ. И в схеме и в экземпляре ХМЛ прописано пространство имен "ххх".

Спасибо за помощь.

Схема под Ваш документ другая:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>

 <xsd:element name='soPayload' type='xsd:string'>
 </xsd:element>

 <xsd:element name='xsoDocument'>
  <xsd:complexType>
   <xsd:sequence>
    <xsd:element ref='soPayload'/>
   </xsd:sequence>
   <xsd:attribute name='version' type='xsd:string' use='required'/>
   <xsd:attribute name='xmlns' type='xsd:string' use='required'/>
  </xsd:complexType>
 </xsd:element>
</xsd:schema>
...
Рейтинг: 0 / 0
XSD и namespace. Не могу пройти валидацию.
    #36547779
PlayerDN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Edkonst2008 спасибо за ответ, но не взлетело :( ошибка при загрузке схемы: "Значение xmlns не может использоваться в качестве имени для объявления атрибута.".

Попутно хочу спросить:
1. Вы объявили в схеме вложенный элемент soPayload на самом верхнем уровне, а затем сослались на него из объявления xsoDocument . В чем отличие от того как сделал я (объявил вложенный элемент внутри родительского)? Так более правильно или это просто один из вариантов?
2. Я начал недавно разбираться с XML и XSD (надо сделать формат сохранения данных своей проге, ну и схему для его проверки), вроде бы все понял но стопорнулся на namespace'ах. По уму, как я понял, требуется иметь свой неймспейс для экземпляра XML, по дефолту он задается в атрибуте xmlns корневого элемента XML. Для того, чтобы сопоставить схему и экземпляр (т.е. что этот xml-файл надо проверять этой схемой) в схеме задаётся атррибут targetNamespace который должен совпадать с нейспейсом из XML-файла (иначе процедуру валидации проходят даже кривые XML-файлы). Вроде бы так. Правильно или я ошибаюсь? Нужны ли вообще мне неймспейсы (без них все работает как надо), будут ли у меня проблемы в будущем если я их не буду использовать?
...
Рейтинг: 0 / 0
XSD и namespace. Не могу пройти валидацию.
    #36582856
bm1984
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня получилось провалидировать вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<?xml version="1.0"?>
<xsl:schema xmlns:xsl="http://www.w3.org/2001/XMLSchema" xmlns="http://www.mberegovoy.ru" targetNamespace="http://www.mberegovoy.ru">
    <xsl:element name="xsoDocument" type="xsoDocumentType"/>
    <xsl:complexType name="xsoDocumentType">
        <xsl:sequence>
            <xsl:element name="soPayload" type="xsl:string" />
        </xsl:sequence>
        <xsl:attribute name="version" type="xsl:string" use ="required"/>
    </xsl:complexType>
</xsl:schema>
Код: plaintext
1.
2.
3.
4.
<?xml version="1.0" encoding="utf-16"?>
<xsoDocument version="1.0" xmlns="http://www.mberegovoy.ru">
    <soPayload xmlns=""></soPayload>
</xsoDocument>

По поводу необходимости использования namespaces описано тут:

Я использую dot net для валидации и описание ошибки при использовании namespaces более удобен для анализа:
The element 'xsoDocument' in namespace 'http://www.mberegovoy.ru' has invalid child element 'soPayload' in namespace 'http://www.mberegovoy.ru'. List of possible elements expected: 'soPayload'.
без namespaces:
The element 'xsoDocument' has invalid child element 'soPayload1'. List of possible elements expected: 'soPayload'.
В первом случае легче определить в чем ошибка, поскольку namespace ясно определяет схему, по которой производится валидация
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
XSD и namespace. Не могу пройти валидацию.
    #39569913
Nashev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PlayerDN1. Вы объявили в схеме вложенный элемент soPayload на самом верхнем уровне, а затем сослались на него из объявления xsoDocument . В чем отличие от того как сделал я (объявил вложенный элемент внутри родительского)? Так более правильно или это просто один из вариантов?
2. Я начал недавно разбираться с XML и XSD (надо сделать формат сохранения данных своей проге, ну и схему для его проверки), вроде бы все понял но стопорнулся на namespace'ах. По уму, как я понял, требуется иметь свой неймспейс для экземпляра XML, по дефолту он задается в атрибуте xmlns корневого элемента XML. Для того, чтобы сопоставить схему и экземпляр (т.е. что этот xml-файл надо проверять этой схемой) в схеме задаётся атррибут targetNamespace который должен совпадать с нейспейсом из XML-файла (иначе процедуру валидации проходят даже кривые XML-файлы). Вроде бы так. Правильно или я ошибаюсь? Нужны ли вообще мне неймспейсы (без них все работает как надо), будут ли у меня проблемы в будущем если я их не буду использовать?

Чё-то ответ какой-то непонятный тут Вам был дан, мне он не помог. Однако, при дальнейшем гуглении сам ответы нашёл, напишу для последователей:

В доке вон оказывается пишут в соответствующей табличке: http://www.w3.org/TR/xmlschema-1/ If form is present and its ·actual value· is qualified, or if form is absent and the ·actual value· of elementFormDefault on the <schema> ancestor is qualified, then the ·actual value· of the targetNamespace [attribute] of the parent <schema> element information item, or ·absent· if there is none, otherwise ·absent·.
Это значит, что если не задать у схемы атрибут elementFormDefault="qualified", то элементы корневого уровня, объявленные непосредственно внутри элемента <xsd:schema>, к targetNamespace схемы отнесены будут, а элементы, объявленные вложенными - на любом более глубоком уровне, если они сделаны не через ref на корневые элементы и не имеют собственного form="qualified", будут отнесены к нему, а к незаданному пространству имён, то есть к xmlns="".

Если дочерний элемент объявлен через ref на элемент корневой, то он имеет свойства корневого, то есть к targetNamespace схемы относится.

В общем, пишите elementFormDefault="qualified" схеме.

Вот такая вот неожиданная особенность. Пол дня на неё сегодня убил (
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSD и namespace. Не могу пройти валидацию.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]