Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > XML, XSL > Непонятки с целевым пространством имён в xsd |
Автор: LostSoul2 1.10.2014, 14:42 |
Добрый день. Я новичок в 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"> ...Содержимое документа. </ИмяПр-ваИмён:имяКорневогоЭлемента> Вопрос возник на фоне примера вот http://msdn.microsoft.com/ru-ru/library/ms256100(v=vs.110).aspx. Для удобства привожу этот пример здесь: <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. |
Автор: LostSoul2 2.10.2014, 01:39 | ||
А если в схеме задать одно целевое пр-во имён, а в самом xml-документе задать другое, вот так: <ИмяПр-ваИмён:имяКорневогоЭлемента xmlns:ИмяПр-ваИмён = "ffffffff" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "blablabla file.xsd"> Что тогда будет? |
Автор: diadiavova 2.10.2014, 19:20 | ||
Тогда данная схема не будет сопоставлена с этим документом. А вот так - это не то же самое, что ты написал. Целевое пространство имен в схеме - задается атрибутом targetNamespace корневого элемента самого xsd-файла. А то, что ты пишешь в schemaLocation - это всего лишь путь к файлу схемы. Не надо путать. В данном случае не будет ровным счетом ничего. Пространство имен заданное в хмл-документе, подразумевает наличие схемы для этого пространства. Если валидатору известно местоположение схемы, то атрибут schemaLocation не нужен вообще, если неизвестно, то можно задать его этим атрибутом, но если в схемалокэйшн ты ты задаешь адрес схемы для пространства имен, не встречающегося в документе, то это просто лишняя информация. Возможно валидатор тебя об этом проинформирует, а возможно просто проигнорирует эти данные. Как он должен себя вести в соответствие со спецификацией и прописано ли его поведение в спецификации - я не знаю. Если интересно - поищи сам, можешь начать отсюда http://www.w3.org/TR/xmlschema11-1/#xsi-namespace А можешь просто попробовать такой документ проверить и посмотреть, что будет. |
Автор: LostSoul2 3.10.2014, 00:08 |
Объясню своё видение ситуации после всего вышеизложенного вами и мной. Если вот так: <ИмяПр-ваИмён:имяКорневогоЭлемента 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 3.10.2014, 00:38 | ||||||
Не все. Во-первых с терминологией путаешься. Не надо путать пространства имен и префиксы.
Здесь пространством имен является urn:my-schemas:x-namespace, а x - это префикс. Разница между ними как между именем переменной и ее значением. В данном случае префикс выполняет роль имени переменной, а пространство имен - ее значения. Не надо эти вещи путать. Во-вторых, области видимости... если ты объявляешь некий префикс пусть даже в корневом элементе, то это означает, что он будет соответствовать любому элементу внутри данного и самому этому элементу, за исключением тех элементов, в которых он будет переопределен. Переопределять можно где угодно. Одному и тому же пространству имен в одной и той же области видимости может соответствовать несколько префиксов(так же как несколько переменных могут ссылаться на один и тот же объект).
|
Автор: LostSoul2 3.10.2014, 02:30 | ||
То есть: если где-то в xml-файле (не обязательно в корневом элементе) объявлено пр-во имён namespaceID, то, в идеале, должна существовать схема с targetNamespace=namespaceID, которая описывает все элементы из xml-документа, находящиеся в области видимости namespaceID? |
Автор: diadiavova 3.10.2014, 12:35 |
Не знаю, что значит "в идеале", но примерно так. Только схема описывает не все элементы в области видимости, а элементы именно этого пространства имен, а они в документе могут появляться в разных местах, кроме того внутри такого элемента так же могут появляться элементы из других пространств. |
Автор: LostSoul2 3.10.2014, 14:05 |
Спасибо, док. |
Автор: LostSoul2 4.10.2014, 23:00 |
Тема реанимируется. Возникли новые вопросы . Пример из книги. Фрагмент 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 5.10.2014, 13:55 | ||||
LostSoul2, будь добр, используй разметку для подсветки кода.
Для вложенных элементов не всегда необходимо указывать префиксы, но для элементов верхнего уровня это нужно. Обычно для того, чтобы избежать этого неудобства в корневом элементе схемы указывают целевое пространство имен для элементов без префиксов.
|
Автор: LostSoul2 5.10.2014, 18:38 | ||
А при каких условиях для вложенных элементов не нужно указывать префикс? И почему всегда нужно указывать префикс для элементов верхнего уровня, раз уж можно указать целевое пр-во имён для всех имён без префиксов в схеме? Почему и имена элементов верхнего уровня не включить в это целевое пространство имён? |
Автор: diadiavova 6.10.2014, 22:49 |
Элементы, объявленные в схеме на верхнем уровне - это элементы, доступные глобально. Они могут в том числе быть корневыми элементами документа и для корневого элемента указать тем или иным способом пространство имен все-таки надо. Для вложенных элементов, в случае отсутствия явного указания пространства имен с помощью префикса, префикс считается относящимся к тому пространству имен, к которому принадлежит родительский элемент(если такая возможность для него предусмотрена схемой, может быть и такое, что префикс придется писать в любом случае). Исходя из этого правила для гибридных документов, в схеме приходится указывать к какому пространству принадлежат элементы верхнего уровня. Кроме того, надо понимать, что в схеме есть два совершенно разных элемента с названием element, фактически это элементы разных типов. ЕМНИП, элементы верхнего уровня имеют и другие отличия от вложенных, так что путать их не надо. |
Автор: LostSoul2 7.10.2014, 02:44 | ||
Xочу уточнить. Вот есть корневой элемент A, в нём - вложенный элемент B, а в нём - ещё несколько вложенных элементов. В элементе B определено пр-во имён: <prefix:B xmlns:prefix="http://blablabla">. И есть схема для этого пр-ва имён: <xsd:schema targetNamespace="http://blablabla" xmlns:prefix="http://blablabla">...</xsd:schema>. В этой схеме элемент B, очевидно, должен описываться с префиксом. А вот те элементы, которые вложены в него - без префикса? |
Автор: diadiavova 7.10.2014, 07:32 | ||
По умолчанию так и есть, но в корневом элементе схемы может быть определён атрибут elementFormDefault, а так же для конкретного элемента - form. Аналогичные правила есть и для атрибутов. http://msdn.microsoft.com/ru-ru/library/ms256460(v=vs.110).aspx |
Автор: LostSoul2 8.10.2014, 12:27 |
А что вообще делают изначально - схему, и под неё пишут xml-документ, или наоборот, схему делают для готового документа? |
Автор: diadiavova 8.10.2014, 12:48 |
Так от задачи зависит. Если ты точно себе представляешь, как должен выглядеть документ, то тожешь начать со схемы. Сейчас многие программы включают инструменты для генерации схемы из документа. Это, как правило, не совсем то, что надо , но ее потом можно слегка подредактировать и все. Иногда бывает, что схема и вовсе не нужна. |
Автор: LostSoul2 21.10.2014, 17:25 | ||||
Добрый день. Есть xml-файл:
Составил для него схему:
Поверяю валидность вот здесь: http://www.freeformatter.com/xml-validator-xsd.html И валидатор орёт, что ему в схеме не нравится имя "cont:contract". Если убрать префикс, то всё нормально. Почему писать "cont:contract неправильно? Ведь я здесь же в схеме прописал xmlns:cont="http://blablabla". Или это валидатор кривой? А если префикс действительно здесь не нужен, зачем тогда объявлять его в схеме через xmlns:cont="http://blablabla"? Или это объявление совсем для чего-то другого делается? |
Автор: diadiavova 21.10.2014, 20:56 |
Префикс не является частью имени, а имя не может содержать двоеточий. Префикс указывает на принадлежность элемента или атрибута некоторому пространству имен и в принципе является внутренним инструментом документа. Схема в принципе не может диктовать какие префиксы в документе можно использовать, а какие нет. Тот префикс, который ты объявил в схеме, используется для разруливания пространств внутри самой схемы и никак не влияет на то, какой префикс будет использоваться в целевом документе для указания на пространство имен, описанное в этой схеме. |
Автор: LostSoul2 22.10.2014, 13:23 | ||||||||
Да, с этим, я кажется, разобрался. Спасибо. Но возникают новые траблы. Есть 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 22.10.2014, 13:55 | ||
Вот если бы ты еще догадался что именно, то было бы вообще замечательно. Я ведь об этом уже писал и причем не далее как в этой самой теме. http://forum.vingrad.ru/index.php?showtopic=380002&view=findpost&p=2625240 |
Автор: LostSoul2 22.10.2014, 14:59 |
Благодарю. Разобрался. Надо elementFormDefault="qualified" attributeFormDefault="qualified". |
Автор: LostSoul2 23.10.2014, 20:57 |
Добрый вечер. Возник ещё вопрос: если в схеме не указано целевое пр-во имён, что это значит для xml-документа, соответствующего этой схеме (при условии, что документ валидный, т.е., действительно ей соответствует)? Что его элементы не должны принадлежать ни к каким пр-вам имён? Или что схема тупо описывает документ, не обращая внимания на пр-ва имён, к которым принадлежат элементы? Спасибо. |
Автор: diadiavova 23.10.2014, 21:14 |
Элементы документа просто не будут сопоставлены схеме и вряд ли будет возможность объяснить валидатору на предмет чего выполняется проверка. Но если такая возможность всё же есть, то результат, видимо, от валидатора и будет зависеть. |
Автор: LostSoul2 23.10.2014, 21:28 |
Зачем же тогда вообще нужны такие схемы? Для чего придуман noNamespaceSchemaLocation? Для каких-то редких случаев? Некоторые примеры, вот этот, в частности - http://wbex.ru/index.php/XML/XML_Schema/noNamespaceSchemaLocation - заставляют думать, что элементы xml-документа для такой схемы именно не должны находиться в каких-либо пр-вах имён. Валидатор этот пример принял, после некоторых доделок, не связанных с пр-вами имён. |
Автор: LostSoul2 2.11.2014, 01:50 |
Добрый вечер. Посоветуйте, пожалуйста, какую-нибудь программу-валидатор, в которой можно было бы использовать схемы, состоящие из нескольких xsd-файлов, соединённых посредством xsd:import. Не шарю в этих программах совсем, а то, что видел в интернете, онлайн или для скачивания, не позволяет работать со схемами из нескольких файлов. |
Автор: diadiavova 2.11.2014, 01:56 |
Я в закрепленной теме оставил ссылку на список программ. Поищи среди них. http://forum.vingrad.ru/index.php?showtopic=51822&view=findpost&p=2546715 |