![]() |
Модераторы: 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 -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
LostSoul2 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 1.10.2014 Репутация: нет Всего: нет |
А что вообще делают изначально - схему, и под неё пишут xml-документ, или наоборот, схему делают для готового документа?
|
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 22 Всего: 142 |
Так от задачи зависит. Если ты точно себе представляешь, как должен выглядеть документ, то тожешь начать со схемы. Сейчас многие программы включают инструменты для генерации схемы из документа. Это, как правило, не совсем то, что надо , но ее потом можно слегка подредактировать и все. Иногда бывает, что схема и вовсе не нужна.
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
LostSoul2 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 1.10.2014 Репутация: нет Всего: нет |
Добрый день.
Есть xml-файл:
Составил для него схему:
Поверяю валидность вот здесь: http://www.freeformatter.com/xml-validator-xsd.html И валидатор орёт, что ему в схеме не нравится имя "cont:contract". Если убрать префикс, то всё нормально. Почему писать "cont:contract неправильно? Ведь я здесь же в схеме прописал xmlns:cont="http://blablabla". Или это валидатор кривой? А если префикс действительно здесь не нужен, зачем тогда объявлять его в схеме через xmlns:cont="http://blablabla"? Или это объявление совсем для чего-то другого делается? Это сообщение отредактировал(а) LostSoul2 - 21.10.2014, 17:26 |
||||
|
|||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 22 Всего: 142 |
Префикс не является частью имени, а имя не может содержать двоеточий. Префикс указывает на принадлежность элемента или атрибута некоторому пространству имен и в принципе является внутренним инструментом документа. Схема в принципе не может диктовать какие префиксы в документе можно использовать, а какие нет. Тот префикс, который ты объявил в схеме, используется для разруливания пространств внутри самой схемы и никак не влияет на то, какой префикс будет использоваться в целевом документе для указания на пространство имен, описанное в этой схеме.
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
LostSoul2 |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 1.10.2014 Репутация: нет Всего: нет |
Да, с этим, я кажется, разобрался. Спасибо. Но возникают новые траблы. Есть xml-файл:
Схема:
Валидатор всё тот же - http://www.freeformatter.com/xml-validator-xsd.html Впрочем, может, я зря всё время даю ссылку на валидатор? Может, они все одинаковые? В вышеизложенном виде всё работает. Но если написать
начинаются вопли, что Invalid Content Was Found Starting With Element 'nsp1:inner'. One Of '{inner}' Is Expected. Что здесь может быть не так? Во всех примерах xml-файлов, что я видел, преспокойно пишут префикс и во вложенных элементах. Хотя догадываюсь, что проблема в схеме, чего-то я там не указал... |
||||||
|
|||||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 22 Всего: 142 |
Вот если бы ты еще догадался что именно, то было бы вообще замечательно. Я ведь об этом уже писал и причем не далее как в этой самой теме. http://forum.vingrad.ru/index.php?showtopi...t&p=2625240 -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
LostSoul2 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 1.10.2014 Репутация: нет Всего: нет |
Благодарю. Разобрался. Надо elementFormDefault="qualified" attributeFormDefault="qualified".
|
|||
|
||||
LostSoul2 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 1.10.2014 Репутация: нет Всего: нет |
Добрый вечер.
Возник ещё вопрос: если в схеме не указано целевое пр-во имён, что это значит для xml-документа, соответствующего этой схеме (при условии, что документ валидный, т.е., действительно ей соответствует)? Что его элементы не должны принадлежать ни к каким пр-вам имён? Или что схема тупо описывает документ, не обращая внимания на пр-ва имён, к которым принадлежат элементы? Спасибо. Это сообщение отредактировал(а) LostSoul2 - 23.10.2014, 20:59 |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 22 Всего: 142 |
Элементы документа просто не будут сопоставлены схеме и вряд ли будет возможность объяснить валидатору на предмет чего выполняется проверка. Но если такая возможность всё же есть, то результат, видимо, от валидатора и будет зависеть.
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
LostSoul2 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 1.10.2014 Репутация: нет Всего: нет |
Зачем же тогда вообще нужны такие схемы? Для чего придуман noNamespaceSchemaLocation? Для каких-то редких случаев?
Некоторые примеры, вот этот, в частности - http://wbex.ru/index.php/XML/XML_Schema/no...eSchemaLocation - заставляют думать, что элементы xml-документа для такой схемы именно не должны находиться в каких-либо пр-вах имён. Валидатор этот пример принял, после некоторых доделок, не связанных с пр-вами имён. Это сообщение отредактировал(а) LostSoul2 - 23.10.2014, 23:31 |
|||
|
||||
LostSoul2 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 1.10.2014 Репутация: нет Всего: нет |
Добрый вечер.
Посоветуйте, пожалуйста, какую-нибудь программу-валидатор, в которой можно было бы использовать схемы, состоящие из нескольких xsd-файлов, соединённых посредством xsd:import. Не шарю в этих программах совсем, а то, что видел в интернете, онлайн или для скачивания, не позволяет работать со схемами из нескольких файлов. |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 22 Всего: 142 |
Я в закрепленной теме оставил ссылку на список программ. Поищи среди них.
http://forum.vingrad.ru/index.php?showtopi...t&p=2546715 -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "XML/XSLT" | |
|
Прежде чем опубликовать вопрос, попробуйте воспользоваться поиском - возможно тема уже поднималась. Также рекомендуем Вам зайти в раздел FAQ ,раздел дополняется и, возможно, там вы увидите готовое решение. Для ответов на часто задаваемые вопросы существует FAQ раздела. Новости можно публиковать в разделе новостей. Для статей так же есть специальный раздел Желаем удачи в Вашем деле! Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, diadiavova. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | XML, XSL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |