Модераторы: diadiavova

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонятки с целевым пространством имён в xsd 
:(
    Опции темы
LostSoul2
Дата 1.10.2014, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 1.10.2014

Репутация: нет
Всего: нет



Добрый день.
Я новичок в xml и всём, что с ним связано; сейчас изучаю язык схем xsd. Возник такой вопрос:
есть файл со схемой file.xsd, и там в схеме задано целевое пр-во имён, скажем,  targetNamespace="blablabla".  Обязательно ли тогда в самом xml-документе, который описывает эта схема, повторно задавать это пр-во имён? Т. е., писать что-то вроде: 
<ИмяПр-ваИмён:имяКорневогоЭлемента  xmlns:ИмяПр-ваИмён = "blablabla"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation = "blablabla  file.xsd">
...Содержимое документа.
</ИмяПр-ваИмён:имяКорневогоЭлемента>

Или можно просто писать:
<ИмяПр-ваИмён:имяКорневогоЭлемента  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation = "blablabla  file.xsd">
...Содержимое документа.
</ИмяПр-ваИмён:имяКорневогоЭлемента>

Вопрос возник на фоне примера вот отсюда.  Для удобства привожу этот пример здесь:
<p:Person
   xmlns:p="http://contoso.com/People"
   xmlns:v="http://contoso.com /Vehicles"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation=
     "http://contoso.com/People 
      http://contoso.com/schemas/people.xsd 
      http://contoso.com/schemas/Vehicles
      http://contoso.com/schemas/vehicles.xsd
      http://contoso.com/schemas/People
      http://contoso.com/schemas/people.xsd">
   <name>John</name>
   <age>28</age>
   <height>59</height>
   <v:Vehicle>
      <color>Red</color>
      <wheels>4</wheels>
      <seats>2</seats>
   </v:Vehicle>
</p:Person>
Как видите, присутствует "лишнее" пр-во имён http://contoso.com/schemas/People, которое упоминается в schemaLocation, но не определяется в корневом элементе Person, в отличие от пространств имён p и v.
PM MAIL   Вверх
diadiavova
Дата 1.10.2014, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5820
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Цитата(LostSoul2 @  1.10.2014,  15:42 Найти цитируемый пост)
 Обязательно ли тогда в самом xml-документе, который описывает эта схема, повторно задавать это пр-во имён?

Обязательно писать xmlns:prefix="namespace", а вот schemaLocation - необязательно. В сущности этот атрибут нужен только для того, чтобы указать валидатору, где находится схема документа, сопоставленная соответствующему пространству имен. Если в этом нет необходимости(например, если программа-валидатор просматривает собственное хранилище схем и находит нужную там), то можно вообще без этого атрибута обойтись. А вот указание пространства имен - совсем другое дело, оно необходимо для того, чтобы указать, к какому пространству относится элемент или атрибут.
Цитата(LostSoul2 @  1.10.2014,  15:42 Найти цитируемый пост)
Как видите, присутствует "лишнее" пр-во имён http://contoso.com/schemas/People, которое упоминается в schemaLocation, но не определяется в корневом элементе Person, в отличие от пространств имён p и v. 

Обычно валидатор, найдя пространство имен, схема для которого не найдена, ищет ее как раз с помощью схемалокейшн, если такой элемент в документе не встречается, то данные о местоположении схемы просто будут проигнорированы. В данном случае ошибки нет, то есть документ валидный, но описание отсутствующего пространства имен здесь действительно лишнее и если его убрать, то смысл документа не изменится.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
LostSoul2
Дата 2.10.2014, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 1.10.2014

Репутация: нет
Всего: нет



Цитата(diadiavova @  1.10.2014,  20:57 Найти цитируемый пост)
Цитата(LostSoul2 @  1.10.2014,  15:42 )
 Обязательно ли тогда в самом xml-документе, который описывает эта схема, повторно задавать это пр-во имён?

Обязательно писать xmlns:prefix="namespace", а вот schemaLocation - необязательно. В сущности этот атрибут нужен только для того, чтобы указать валидатору, где находится схема документа, сопоставленная соответствующему пространству имен. Если в этом нет необходимости(например, если программа-валидатор просматривает собственное хранилище схем и находит нужную там), то можно вообще без этого атрибута обойтись. А вот указание пространства имен - совсем другое дело, оно необходимо для того, чтобы указать, к какому пространству относится элемент или атрибут.


А если в схеме задать одно целевое пр-во имён, а в самом xml-документе задать другое, вот так:
<ИмяПр-ваИмён:имяКорневогоЭлемента  xmlns:ИмяПр-ваИмён = "ffffffff"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation = "blablabla  file.xsd">
Что тогда будет?
PM MAIL   Вверх
diadiavova
Дата 2.10.2014, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5820
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Цитата(LostSoul2 @  2.10.2014,  02:39 Найти цитируемый пост)
А если в схеме задать одно целевое пр-во имён, а в самом xml-документе задать другое

Тогда данная схема не будет сопоставлена с этим документом.
Цитата(LostSoul2 @  2.10.2014,  02:39 Найти цитируемый пост)
вот так:

А вот так - это не то же самое, что ты написал. Целевое пространство имен в схеме - задается атрибутом targetNamespace корневого элемента самого xsd-файла. А то, что ты пишешь в schemaLocation - это всего лишь путь к файлу схемы. Не надо путать. В данном случае не будет ровным счетом ничего. Пространство имен заданное в хмл-документе, подразумевает наличие схемы для этого пространства. Если валидатору известно местоположение схемы, то атрибут schemaLocation не нужен вообще, если неизвестно, то можно задать его этим атрибутом, но если в схемалокэйшн ты ты задаешь адрес схемы для пространства имен, не встречающегося в документе, то это просто лишняя информация. Возможно валидатор тебя об этом проинформирует, а возможно просто проигнорирует эти данные. Как он должен себя вести в соответствие со спецификацией и прописано ли его поведение в спецификации - я не знаю. Если интересно - поищи сам, можешь начать отсюда
http://www.w3.org/TR/xmlschema11-1/#xsi-namespace
А можешь просто попробовать такой документ проверить и посмотреть, что будет.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
LostSoul2
Дата 3.10.2014, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 1.10.2014

Репутация: нет
Всего: нет



Объясню своё видение ситуации после всего вышеизложенного вами и мной.
Если вот так:
<ИмяПр-ваИмён:имяКорневогоЭлемента  xmlns:ИмяПр-ваИмён = "blablabla"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation = "blablabla  file.xsd"> - то есть, имя пр-ва имён, заданного в корневом элементе, и имя целевого пр-ва имён, заданного в схеме, одинаковы и равны blablabla. Это значит, что схема ставится в соответствие той части xml-файла, на которую распространяется пр-во имён blablabla (ну, в данном случае оно распространяется на весь файл, т.к. было объявлено в корневом элементе). Т.е., в схеме должны описываться только элементы, которые в xml-файле встречаются в зоне действия пр-ва имён  blablabla.

Если вот так:
<ИмяПр-ваИмён:имяКорневогоЭлемента  xmlns:ИмяПр-ваИмён = "fffffff"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation = "blablabla  file.xsd"> - имена пространств имён fffffff и blablabla не совпадают. Это значит, что схема вообще ничему не соответствует в данном файле и, в сущности, с ним не связана.

Я всё правильно понял?


PM MAIL   Вверх
diadiavova
Дата 3.10.2014, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5820
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Цитата(LostSoul2 @  3.10.2014,  01:08 Найти цитируемый пост)
Я всё правильно понял?

Не все. Во-первых с терминологией путаешься. Не надо путать пространства имен и префиксы.
Код

<x:root xmlns:x="urn:my-schemas:x-namespace">...

Здесь пространством имен является urn:my-schemas:x-namespace, а x - это префикс. Разница между ними как между именем переменной и ее значением. В данном случае префикс выполняет роль имени переменной, а пространство имен - ее значения. Не надо эти вещи путать.
 Во-вторых, области видимости... если ты объявляешь некий префикс пусть даже в корневом элементе, то это означает, что он будет соответствовать любому элементу внутри данного и самому этому элементу, за исключением тех элементов, в которых он будет переопределен. Переопределять можно где угодно. Одному и тому же пространству имен в одной и той же области видимости может соответствовать несколько префиксов(так же как несколько переменных могут ссылаться на один и тот же объект).

Цитата(LostSoul2 @  3.10.2014,  01:08 Найти цитируемый пост)
 имя пр-ва имён, заданного в корневом элементе, и имя целевого пр-ва имён, заданного в схеме, одинаковы и равны blablabla. Это значит, что схема ставится в соответствие той части xml-файла, на которую распространяется пр-во имён blablabla (ну, в данном случае оно распространяется на весь файл, т.к. было объявлено в корневом элементе).
Я немного иначе сформулирую, поскольку в твоей формулировке есть не очень конкретные определения. Схема предназначена для определения структуры некоего документа. Пространство имен - в теории уникальная строка, которая идентифицирует схему, то есть это ее глобально-уникальный идентификатор, если хочешь. В документе ты указываешь пространство имен для того, чтобы явно обозначить в какой именно схеме описан данный элемент или атрибут, это особенно критично для гибридных документов, в которых могут присутствовать элементы, описанные в разных схемах. Поскольку имена элементов не обязаны быть уникальными, то вполне может возникнуть ситуация, когда они совпадут и не будет ясно к какой схеме относится элемент. Именно поэтому их соотносят с пространствами имен, для того, чтобы не было неоднозначности. 
Цитата(LostSoul2 @  3.10.2014,  01:08 Найти цитируемый пост)
Если вот так:
<ИмяПр-ваИмён:имяКорневогоЭлемента  xmlns:ИмяПр-ваИмён = "fffffff"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation = "blablabla  file.xsd"> - имена пространств имён fffffff и blablabla не совпадают. Это значит, что схема вообще ничему не соответствует в данном файле и, в сущности, с ним не связана.
Тут уточнение: если пространство blablabla в документе нигде не используется, то это лишняя информация, но вовсе не обязательно оно должно быть объявлено именно в корневом элементе. То есть схемалокейшн будет в корневом элементе и вовсе не обязательно, чтобы это пространство было объявлено там же. И то, что имена пространств не совпадают вообще значения не имеет. Еще раз повторяю, что местоположение схемы, связанной с пространством имен вовсе не обязано присутствовать в документе. В данном случае правильнее было бы сказать, что информация из схемалокейшн не имеет никакого отношения к объявленному пространству имен, но сказать, что она совсем ничему не соответствует в данном документе нельзя, поскольку вполне может соответствовать(смотри выше).



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
LostSoul2
Дата 3.10.2014, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 1.10.2014

Репутация: нет
Всего: нет



Цитата(diadiavova @  3.10.2014,  00:38 Найти цитируемый пост)
Цитата(LostSoul2 @  3.10.2014,  01:08 )
 имя пр-ва имён, заданного в корневом элементе, и имя целевого пр-ва имён, заданного в схеме, одинаковы и равны blablabla. Это значит, что схема ставится в соответствие той части xml-файла, на которую распространяется пр-во имён blablabla (ну, в данном случае оно распространяется на весь файл, т.к. было объявлено в корневом элементе).
Я немного иначе сформулирую, поскольку в твоей формулировке есть не очень конкретные определения. Схема предназначена для определения структуры некоего документа. Пространство имен - в теории уникальная строка, которая идентифицирует схему, то есть это ее глобально-уникальный идентификатор, если хочешь. В документе ты указываешь пространство имен для того, чтобы явно обозначить в какой именно схеме описан данный элемент или атрибут, это особенно критично для гибридных документов, в которых могут присутствовать элементы, описанные в разных схемах. Поскольку имена элементов не обязаны быть уникальными, то вполне может возникнуть ситуация, когда они совпадут и не будет ясно к какой схеме относится элемент. Именно поэтому их соотносят с пространствами имен, для того, чтобы не было неоднозначности. 


То есть: если где-то в xml-файле (не обязательно в корневом элементе) объявлено пр-во имён namespaceID, то, в идеале, должна существовать схема с  targetNamespace=namespaceID, которая описывает все элементы из xml-документа, находящиеся в области видимости namespaceID?
PM MAIL   Вверх
diadiavova
Дата 3.10.2014, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5820
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Не знаю, что значит "в идеале", но примерно так. Только схема описывает не все элементы в области видимости, а элементы именно этого пространства имен, а они в документе могут появляться в разных местах, кроме того внутри такого элемента так же могут появляться элементы из других пространств.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
LostSoul2
Дата 3.10.2014, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 1.10.2014

Репутация: нет
Всего: нет



Спасибо, док.
PM MAIL   Вверх
LostSoul2
Дата 4.10.2014, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 1.10.2014

Репутация: нет
Всего: нет



Тема реанимируется. Возникли новые вопросы . 

Пример из книги. Фрагмент XML-файла:
<cont:contract xmlns:cont="http://blablabla">
   <cont:type>Трудовой договор</cont:type>
   <cont:name>Пётр Петров</cont:name>
</cont:contract>

Схема, описывающая пр-во имён http://blablabla:
<xsd:schema targetNamespace="http://blablabla" xmlns:cont="http://blablabla">
  <xsd:element name="cont:contract">
   <xsd:complexType>
      <xsd:all>
         <xsd:element name="type" type="normalizedString" />
         <xsd:element name="name" type="normalizedString" />
      </xsd:all>
   </xsd:complexType>
  </xsd:element>
</xsd:schema>

Вопрос: почему в схеме нужно писать <xsd:element name="cont:contract">, но при этом не нужно писать name="cont:type" и name="cont:name"?
Заранее спасибо.
PM MAIL   Вверх
diadiavova
Дата 5.10.2014, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5820
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



LostSoul2, будь добр, используй разметку для подсветки кода.



Цитата(LostSoul2 @  5.10.2014,  00:00 Найти цитируемый пост)
Вопрос: почему в схеме нужно писать <xsd:element name="cont:contract">, но при этом не нужно писать name="cont:type" и name="cont:name"?

Для вложенных элементов не всегда необходимо указывать префиксы, но для элементов верхнего уровня это нужно. Обычно для того, чтобы избежать этого неудобства в корневом элементе схемы указывают целевое пространство имен для элементов без префиксов. 
Код

<xsd:schema targetNamespace="http://blablabla" xmlns:cont="http://blablabla" xmlns="http://blablabla">



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
LostSoul2
Дата 5.10.2014, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 1.10.2014

Репутация: нет
Всего: нет



Цитата(diadiavova @  5.10.2014,  13:55 Найти цитируемый пост)
Для вложенных элементов не всегда необходимо указывать префиксы, но для элементов верхнего уровня это нужно.  Обычно для того, чтобы избежать этого неудобства в корневом элементе схемы указывают целевое пространство имен для элементов без префиксов. 


А при каких условиях для вложенных элементов не нужно указывать префикс?
И почему всегда нужно указывать префикс для элементов верхнего уровня, раз уж можно указать целевое пр-во имён для всех имён без префиксов в схеме? Почему и имена элементов верхнего уровня не включить в это целевое пространство имён?
PM MAIL   Вверх
diadiavova
Дата 6.10.2014, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5820
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Элементы, объявленные в схеме на верхнем уровне - это элементы, доступные глобально. Они могут в том числе быть корневыми элементами документа и для корневого элемента указать тем или иным способом пространство имен все-таки надо. Для вложенных элементов, в случае отсутствия явного указания пространства имен с помощью префикса, префикс считается относящимся к тому пространству имен, к которому принадлежит родительский элемент(если такая возможность для него предусмотрена схемой, может быть и такое, что префикс придется писать в любом случае). Исходя из этого правила для гибридных документов, в схеме приходится указывать к какому пространству принадлежат элементы верхнего уровня. Кроме того, надо понимать, что в схеме есть два совершенно разных элемента с названием element, фактически это элементы разных типов. ЕМНИП, элементы верхнего уровня имеют и другие отличия от вложенных, так что путать их не надо.



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
LostSoul2
Дата 7.10.2014, 02:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 1.10.2014

Репутация: нет
Всего: нет



Цитата(diadiavova @  6.10.2014,  22:49 Найти цитируемый пост)
Элементы, объявленные в схеме на верхнем уровне - это элементы, доступные глобально. Они могут в том числе быть корневыми элементами документа


Xочу уточнить. Вот есть корневой элемент A, в нём - вложенный элемент B, а в нём - ещё несколько вложенных элементов. В элементе B определено пр-во имён: <prefix:B xmlns:prefix="http://blablabla">.
И есть  схема для этого пр-ва имён: <xsd:schema targetNamespace="http://blablabla" xmlns:prefix="http://blablabla">...</xsd:schema>. В этой схеме элемент B, очевидно, должен описываться с префиксом. А вот те элементы, которые вложены в него - без префикса?
PM MAIL   Вверх
diadiavova
Дата 7.10.2014, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5820
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Цитата(LostSoul2 @  7.10.2014,  03:44 Найти цитируемый пост)
В этой схеме элемент B, очевидно, должен описываться с префиксом. А вот те элементы, которые вложены в него - без префикса?

По умолчанию так и есть, но в корневом элементе схемы может быть определён атрибут elementFormDefault, а так же для конкретного элемента - form. Аналогичные правила есть и для атрибутов.
http://msdn.microsoft.com/ru-ru/library/ms...(v=vs.110).aspx


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

Прежде чем опубликовать вопрос, попробуйте воспользоваться поиском - возможно тема уже поднималась.

Также рекомендуем Вам зайти в раздел FAQ ,раздел дополняется и, возможно, там вы увидите готовое решение.

Для ответов на часто задаваемые вопросы существует FAQ раздела. Новости можно публиковать в разделе новостей. Для статей так же есть специальный раздел

Желаем удачи в Вашем деле!


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | XML, XSL | Следующая тема »


 




[ Время генерации скрипта: 0.1501 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.