![]() |
Модераторы: diadiavova |
![]() ![]() ![]() |
|
LostSoul2 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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. |
|||
|
||||
diadiavova |
|
||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 22 Всего: 142 |
Обязательно писать xmlns:prefix="namespace", а вот schemaLocation - необязательно. В сущности этот атрибут нужен только для того, чтобы указать валидатору, где находится схема документа, сопоставленная соответствующему пространству имен. Если в этом нет необходимости(например, если программа-валидатор просматривает собственное хранилище схем и находит нужную там), то можно вообще без этого атрибута обойтись. А вот указание пространства имен - совсем другое дело, оно необходимо для того, чтобы указать, к какому пространству относится элемент или атрибут.
Обычно валидатор, найдя пространство имен, схема для которого не найдена, ищет ее как раз с помощью схемалокейшн, если такой элемент в документе не встречается, то данные о местоположении схемы просто будут проигнорированы. В данном случае ошибки нет, то есть документ валидный, но описание отсутствующего пространства имен здесь действительно лишнее и если его убрать, то смысл документа не изменится. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
||||
|
|||||
LostSoul2 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 1.10.2014 Репутация: нет Всего: нет |
А если в схеме задать одно целевое пр-во имён, а в самом xml-документе задать другое, вот так: <ИмяПр-ваИмён:имяКорневогоЭлемента xmlns:ИмяПр-ваИмён = "ffffffff" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "blablabla file.xsd"> Что тогда будет? |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 22 Всего: 142 |
Тогда данная схема не будет сопоставлена с этим документом. А вот так - это не то же самое, что ты написал. Целевое пространство имен в схеме - задается атрибутом targetNamespace корневого элемента самого xsd-файла. А то, что ты пишешь в schemaLocation - это всего лишь путь к файлу схемы. Не надо путать. В данном случае не будет ровным счетом ничего. Пространство имен заданное в хмл-документе, подразумевает наличие схемы для этого пространства. Если валидатору известно местоположение схемы, то атрибут schemaLocation не нужен вообще, если неизвестно, то можно задать его этим атрибутом, но если в схемалокэйшн ты ты задаешь адрес схемы для пространства имен, не встречающегося в документе, то это просто лишняя информация. Возможно валидатор тебя об этом проинформирует, а возможно просто проигнорирует эти данные. Как он должен себя вести в соответствие со спецификацией и прописано ли его поведение в спецификации - я не знаю. Если интересно - поищи сам, можешь начать отсюда http://www.w3.org/TR/xmlschema11-1/#xsi-namespace А можешь просто попробовать такой документ проверить и посмотреть, что будет. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
LostSoul2 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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 не совпадают. Это значит, что схема вообще ничему не соответствует в данном файле и, в сущности, с ним не связана. Я всё правильно понял? |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 22 Всего: 142 |
Не все. Во-первых с терминологией путаешься. Не надо путать пространства имен и префиксы.
Здесь пространством имен является urn:my-schemas:x-namespace, а x - это префикс. Разница между ними как между именем переменной и ее значением. В данном случае префикс выполняет роль имени переменной, а пространство имен - ее значения. Не надо эти вещи путать. Во-вторых, области видимости... если ты объявляешь некий префикс пусть даже в корневом элементе, то это означает, что он будет соответствовать любому элементу внутри данного и самому этому элементу, за исключением тех элементов, в которых он будет переопределен. Переопределять можно где угодно. Одному и тому же пространству имен в одной и той же области видимости может соответствовать несколько префиксов(так же как несколько переменных могут ссылаться на один и тот же объект). Я немного иначе сформулирую, поскольку в твоей формулировке есть не очень конкретные определения. Схема предназначена для определения структуры некоего документа. Пространство имен - в теории уникальная строка, которая идентифицирует схему, то есть это ее глобально-уникальный идентификатор, если хочешь. В документе ты указываешь пространство имен для того, чтобы явно обозначить в какой именно схеме описан данный элемент или атрибут, это особенно критично для гибридных документов, в которых могут присутствовать элементы, описанные в разных схемах. Поскольку имена элементов не обязаны быть уникальными, то вполне может возникнуть ситуация, когда они совпадут и не будет ясно к какой схеме относится элемент. Именно поэтому их соотносят с пространствами имен, для того, чтобы не было неоднозначности. Тут уточнение: если пространство blablabla в документе нигде не используется, то это лишняя информация, но вовсе не обязательно оно должно быть объявлено именно в корневом элементе. То есть схемалокейшн будет в корневом элементе и вовсе не обязательно, чтобы это пространство было объявлено там же. И то, что имена пространств не совпадают вообще значения не имеет. Еще раз повторяю, что местоположение схемы, связанной с пространством имен вовсе не обязано присутствовать в документе. В данном случае правильнее было бы сказать, что информация из схемалокейшн не имеет никакого отношения к объявленному пространству имен, но сказать, что она совсем ничему не соответствует в данном документе нельзя, поскольку вполне может соответствовать(смотри выше). -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
LostSoul2 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 1.10.2014 Репутация: нет Всего: нет |
То есть: если где-то в xml-файле (не обязательно в корневом элементе) объявлено пр-во имён namespaceID, то, в идеале, должна существовать схема с targetNamespace=namespaceID, которая описывает все элементы из xml-документа, находящиеся в области видимости namespaceID? |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 22 Всего: 142 |
Не знаю, что значит "в идеале", но примерно так. Только схема описывает не все элементы в области видимости, а элементы именно этого пространства имен, а они в документе могут появляться в разных местах, кроме того внутри такого элемента так же могут появляться элементы из других пространств.
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
LostSoul2 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 1.10.2014 Репутация: нет Всего: нет |
Спасибо, док.
|
|||
|
||||
LostSoul2 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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"? Заранее спасибо. |
|||
|
||||
diadiavova |
|
||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 22 Всего: 142 |
LostSoul2, будь добр, используй разметку для подсветки кода.
Для вложенных элементов не всегда необходимо указывать префиксы, но для элементов верхнего уровня это нужно. Обычно для того, чтобы избежать этого неудобства в корневом элементе схемы указывают целевое пространство имен для элементов без префиксов.
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
||||
|
|||||
LostSoul2 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 1.10.2014 Репутация: нет Всего: нет |
А при каких условиях для вложенных элементов не нужно указывать префикс? И почему всегда нужно указывать префикс для элементов верхнего уровня, раз уж можно указать целевое пр-во имён для всех имён без префиксов в схеме? Почему и имена элементов верхнего уровня не включить в это целевое пространство имён? |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 22 Всего: 142 |
Элементы, объявленные в схеме на верхнем уровне - это элементы, доступные глобально. Они могут в том числе быть корневыми элементами документа и для корневого элемента указать тем или иным способом пространство имен все-таки надо. Для вложенных элементов, в случае отсутствия явного указания пространства имен с помощью префикса, префикс считается относящимся к тому пространству имен, к которому принадлежит родительский элемент(если такая возможность для него предусмотрена схемой, может быть и такое, что префикс придется писать в любом случае). Исходя из этого правила для гибридных документов, в схеме приходится указывать к какому пространству принадлежат элементы верхнего уровня. Кроме того, надо понимать, что в схеме есть два совершенно разных элемента с названием element, фактически это элементы разных типов. ЕМНИП, элементы верхнего уровня имеют и другие отличия от вложенных, так что путать их не надо.
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
LostSoul2 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 1.10.2014 Репутация: нет Всего: нет |
Xочу уточнить. Вот есть корневой элемент A, в нём - вложенный элемент B, а в нём - ещё несколько вложенных элементов. В элементе B определено пр-во имён: <prefix:B xmlns:prefix="http://blablabla">. И есть схема для этого пр-ва имён: <xsd:schema targetNamespace="http://blablabla" xmlns:prefix="http://blablabla">...</xsd:schema>. В этой схеме элемент B, очевидно, должен описываться с префиксом. А вот те элементы, которые вложены в него - без префикса? |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 22 Всего: 142 |
По умолчанию так и есть, но в корневом элементе схемы может быть определён атрибут elementFormDefault, а так же для конкретного элемента - form. Аналогичные правила есть и для атрибутов. http://msdn.microsoft.com/ru-ru/library/ms...(v=vs.110).aspx -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "XML/XSLT" | |
|
Прежде чем опубликовать вопрос, попробуйте воспользоваться поиском - возможно тема уже поднималась. Также рекомендуем Вам зайти в раздел FAQ ,раздел дополняется и, возможно, там вы увидите готовое решение. Для ответов на часто задаваемые вопросы существует FAQ раздела. Новости можно публиковать в разделе новостей. Для статей так же есть специальный раздел Желаем удачи в Вашем деле! Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, diadiavova. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | XML, XSL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |