Как связать xml и xsd

Обновлено: 23.07.2024

В этом пошаговом руководстве подробно описан процесс создания нового XML-документа. В нем также используются некоторые функции редактора XML, благодаря которым это приложение становится очень полезным при создании XML-документов.

Прежде чем начать работу с пошаговым руководством, сохраните файл hireDate.xsd (содержится ниже в данном разделе) на локальном компьютере.

Создание XML-файла и связывание его со схемой XML

В меню Файл выберите пункт Создать, затем — Файл.

Выберите в области Шаблоны пункт XML-файл и нажмите кнопку Открыть.

Новый файл открывается в редакторе. Этот файл содержит XML-декларацию по умолчанию: .

В окне свойств документа нажмите кнопку обзора ( . ) в поле Схемы.

Отобразится диалоговое окно XSD-схемы.

Отображается диалоговое окно Открытие XSD-схемы.

Выберите файл hireDate.xsd и нажмите кнопку Открыть.

Теперь с XML-документом связана XML-схема. Эта XML-схема используется для проверки правильности документа. Также она используется технологией IntelliSense для заполнения списка допустимых элементов.

Добавление данных

Список членов отображает следующие возможные элементы:

!-- для добавления комментария.

!DOCTYPE для добавления типа документа.

? для добавления инструкции по обработке.

сотрудник для добавления корневого элемента.

Редактор вставляет закрывающий тег комментария и помещает курсор между открывающим и закрывающим тегами комментария.

Введите Test XML file.

Введите знак > , чтобы закрыть тег.

Редактор добавляет XML-элемент, , и помещает курсор после открывающего тега ID.

Введите abc.

Щелкните правой кнопкой мыши элемент ID и выберите команду Перейти к определению.

Редактор открывает файл hireDate.xsd в новом окне документа и помещает курсор на определении элемента схемы ID.

Вернитесь к XML-файлу и замените текст abc на 123.

Редактор добавляет XML-элемент и помещает курсор после открывающего тега элемента «hire-date».

Введите 10.01.2003 в качестве значения даты найма.

Форматирование XML-документа

Кнопка форматирования XML-документа в Visual Studio

XML-документ будет переформатирован.

Сохранение XML-документа

В меню Файл щелкните Сохранить как.

Отобразится диалоговое окно Сохранение файла. Имя файла по умолчанию — "XMLFile1" .

Введите имя файла и место сохранения для XML-документа и нажмите кнопку Сохранить.

Been wondering, just as we use the -declaration to bind XML to a DTD, how do we do it with XSD?

is it the xsi:NoNamespaceSchemaLocation that does the trick? Or is this just another namespace?

[EDIT] And is the

..line just for giving us a unique XML namespace, or does it also provide information on where the schema can be located?

4 Answers 4

Try schemaLocation.

But indeed, it could go wrong, as here, but then again, it's considered a bug for a reason.

To go short : I just trust it, with no harm so far :-)

I don't think any half-decent xml processor can ignore this 'hint' these days.

The urls are always for uniqueness, but in some cases some info will be provided under the URL.

If you're running in an environment in which access to the Internet is blocked, schemas won't load. Besides, your syntax is wrong. It's namespacelocationnamespacelocation.

@David : true enough I edited id. Although at the time they (I know not for now) they claimed to be W3C compliant.

How does the XML processor locate the note.xsd file? Where is that located in relationship to w3schools?

xsi:noNamespaceSchemaLocation and xsi:schemaLocation both provide hints to XML processors who decide to obey those hints. But they are only hints. They do not necessarily cause your document to validate against the schema.

I generally just include the namespace and expect that if whomever is processing it cares to validate it, then they will get the schema and set up their processing environment so that it can find the XSD. I've had limited success with xsi:schemaLocation and such attributes. Most of the problems are usually centered around finding the XSD file itself. Some processors want the path to be included which is loads of fun if the XSD is on a file system instead of a web server.

Every processor seems to implement the lookup a little differently. Some use separate schema catalog objects, others require you to load and attach schemas separately. Unless you are providing the code to process documents, you are best off to not include xsi:schemaLocation or xsi:noNamespaceSchemaLocation IMHO. The only thing that their inclusion can do is hamstring whomever is processing your document into either placing the schema in the same location or find some way to make their chosen processor ignore or workaround the location specification.

As a side note, the biggest problem that I've run into was actually with DTDs that were specified using a SYSTEM declaration that referred to "c:\somepath\doc.dtd" . The problem was that I was processing the documents on a FreeBSD box. I ended up writing my own resolver to map Windows-style paths to a local file system since I could not modify the documents themselves and was required to validate them.

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

XML документ

Давайте посмотрим на следующий XML документ под названием "shiporder.xml":

Приведенный выше XML документ состоит из корневого элемента shiporder с обязательным атрибутом orderid. Элемент shiporder содержит три дочерних элемента: orderperson, shipto и item. Элемент item используется дважды и содержит элемент title, необязательный элемент note, а также элементы quantity и price.

Строка xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" говорит XML парсеру, что этот документ должен быть проверен на соответствие схеме. Строка xsi:noNamespaceSchemaLocation="shiporder.xsd" указывает, где именно находится схема (в данном случае она находится в той же папке, что и файл "shiporder.xml").

Создание XML схемы

Теперь для приведенного выше XML документа создадим XML схему.

Создадим новый файл, который назовем "shiporder.xsd". Для создания XML схемы будем просто следовать за структурой XML документа и определять каждый встреченный элемент. Начнем со стандартной XML декларации, за которой опишем элемент xs:schema, который и определяет саму схему:

Теперь мы должны определить элемент shiporder. У этого элемента есть атрибут, и он содержит другие элементы, поэтому мы рассматриваем его как элемент составного типа. Определения дочерних элементов элемента shiporder поместим в декларацию xs:sequence, что задает жесткую последовательность подэлементов:

Теперь определим элемент orderperson, который будет простого типа (так как он не содержит ни атрибуты, ни другие элементы). Его тип (xs:string) имеет префикс пространства имен, ассоциированного с XML схемой, что указывает на использование предопределенного типа данных:

Теперь нам нужно определить два элемента составного типа: shipto и item. Начнем с определения элемента shipto:

При помощи схем мы можем определить число возможных вхождений любого элемента. В этом нам помогут атрибуты maxOccurs и minOccurs. Атрибут maxOccurs задает максимальное число вхождений элемента, а атрибут minOccurs задает минимальное число вхождений. По умолчанию значение обоих атрибутов равно 1.

Теперь определим элемент item. Этот элемент может использоваться неограниченное число раз внутри элемента shiporder. Определить такую особенность элемента item позволяет присваивание атрибуту maxOccurs значения "unbounded". Это означает, что элемент item может использоваться столько раз, сколько нужно автору документа. Обратите внимание, что элемент note опционален. Определим это установив атрибут minOccurs в нулевое значение:

Теперь мы можем декларировать атрибут элемента shiporder. Поскольку это обязательный атрибут, используем определение use="required".

Примечание: Атрибуты должны всегда декларироваться последними:

Вот полный код файла схемы "shiporder.xsd":

Разделение схемы

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

Следующий способ компоновки схемы заключается в том, что сначала определяются все элементы и атрибуты, а затем на эти определения создаются ссылки при помощи атрибута ref.

Ниже приводится новая компоновка файла схемы ("shiporder.xsd"):

Использование поименованых типов

Третий способ компоновки схемы предполагает определение классов или типов, которые позволяют повторное использование определений элементов. Это становится возможным, если дать имена элементам simpleTypes и complexTypes, а затем указать на них при помощи атрибута type.

Третий способ компоновки файла схемы ("shiporder.xsd"):

Элемент restriction указывает на то, что тип данных является производным от типов данных из пространства имен W3C XML Schema. Таким образом, следующий фрагмент кода означает, что значение элемента или атрибута должно быть строковым:

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

Этот фрагмент кода указывает, что значение элемента или атрибута должно быть строковым, ровно шесть символов в длину, и этими символами должны быть цифры от 0 до 9.

интересно, так же, как мы используем-объявление для привязки XML к DTD, как мы делаем это с XSD?

это xsi: NoNamespaceSchemaLocation, который делает трюк? Или это просто другое пространство имен?

[редактирование] И это

..строка только для предоставления нам уникального пространства имен XML или также предоставляет информацию о том, где может быть расположена схема?

попробовать schemaLocation.

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

короче говоря : я просто доверяю ему, пока без вреда: -)

Я не думаю, что любой наполовину приличный XML-процессор может игнорировать этот "намек" в эти дни.

URL-адреса всегда уникальны, но в некоторых случаях некоторая информация будет предоставлена под URL-адресом.

xsi:noNamespaceSchemaLocation и xsi: schemaLocation предоставляют подсказки XML-процессорам, которые решают подчиняться этим подсказкам. Но это только намеки. Они не обязательно приводят к проверке документа на соответствие схеме.

Я обычно просто включаю пространство имен и ожидаю, что если кто-то обрабатывает его, чтобы проверить его, то они получат схему и настроят свою среду обработки, чтобы она могла найти XSD. У меня был ограниченный успех с xsi:schemaLocation и такие атрибуты. Большинство проблем обычно сосредоточены вокруг поиска самого файла XSD. Некоторые процессоры хотят, чтобы путь был включен, что очень весело, если XSD находится в файловой системе, а не на веб-сервере.

каждый процессор, похоже, реализует поиск немного по-другому. Некоторые используют отдельные объекты каталога схем, другие требуют загрузки и присоединения схем по отдельности. Если вы не предоставляете код для обработки документов, вам лучше не включать xsi:schemaLocation или xsi:noNamespaceSchemaLocation ИМХО. Единственное, что может сделать их включение, это hamstring, кто обрабатывает ваш документ либо помещает схему в одно и то же место, либо находит способ заставить выбранный процессор игнорировать или обходить спецификация местоположения.

в качестве примечания, самая большая проблема, с которой я столкнулся, была на самом деле с DTDs, которые были указаны с помощью SYSTEM декларация, которая относится к "c:\somepath\doc.dtd" . Проблема заключалась в том, что я обрабатывал документы на коробке FreeBSD. Я закончил тем, что написал свой собственный распознаватель для сопоставления путей в стиле Windows с локальной файловой системой, поскольку я не мог изменить сами документы и должен был их проверить.

Это не глупый вопрос, но Джон Сондерс прав.

Так же, как мы используем-decleration для привязки XML к DTD, как мы делаем это с XSD?

вот суть проблемы-вы не можете. Одна из проблем подхода DTD заключалась в том, что в документе указывался механизм проверки, а не потребитель документа. После DTD вы можете взять XML-документ и проверить его с помощью XSD или RELAX NG или другого механизма - они разъединены (по крайней мере теоретически). Любая ссылка XSD является только подсказкой и является необязательной. невозможно проверить произвольный документ.

в чем разница между расширяемым языком разметки (XML) и схемой XML (XSD)?

на самом деле xsd-это сам xml. Его целью является проверка структуры XML-документа. Xsd не является обязательным для любого xml, но он гарантирует, что xml может быть использован для некоторых конкретных целей. Xml содержит только данные в подходящем формате и структуре.

и создайте xsd для этого:

что невозможно с XSD: хотел бы написать его первым, так как список очень мал
1) Вы не можете проверить узел/атрибут, используя значение другого узла/атрибута.
2) это ограничение : элемент, определенный в XSD-файле, должен быть определен только с одним типом данных. [в приведенном выше примере, для появляется в другом node, тип данных не может быть определен, кроме int.
3) Вы не можете игнорировать проверку элементов и атрибутов, т. е., если элемент/атрибут появляется в XML, он должен быть четко определен в соответствующем XSD. Хотя использование позволяет, но у него есть свои правила. Соблюдение, которое приводит к ошибке проверки. Я пытался применить подобный подход и, конечно, не преуспел.--20-->вот Q & A

что возможно с XSD:
1) Вы можете проверить правильную иерархию узлов XML. [xsd определяет, какой ребенок должен находиться под каким родителем и т. д., соблюдение которого будет считаться ошибкой, в приведенном выше примере child_two не может быть непосредственным потомком root, но это ребенок тега "parent", который, в свою очередь, является дочерним узлом "root", существует иерархия..]
2)Вы можете определить тип данных значений узлов. [в приведенном выше примере child_two не может иметь никаких других данных, кроме числа]
3) Вы также можно определить пользовательские типы данных, [например, для node возможные данные могут быть одним из 12 месяцев.. поэтому вам нужно определить все 12 месяцев в новом типе данных, записывая все имена 12 месяцев в качестве значений перечисления .. проверка показывает ошибку, если входной XML содержит любое другое значение, чем эти 12 значений .. ]
4) Вы можете поставить ограничение на появление элементов, используя minOccurs и maxOccurs, значения по умолчанию-1 и 1.

.. и многое другое .

имя xsd:
XSD (определение схемы XML) указывает, как формально описать элементы в документе расширяемого языка разметки (XML).
XML-код:
XML был разработан для опишите данные.Он независим от программного обеспечения, а также аппаратного обеспечения.
Это усиливает следующие вещи.
-Обмен данными.
-Платформо-независимый.
-Повышение доступности данных.

XSD основан и написан на XML.

XSD определяет элементы и структуры, которые могут отображаться в документе, а XML-нет.

XSD гарантирует, что данные правильно интерпретируются, а XML-нет.

документ XSD проверяется как XML, но обратное может быть не всегда верно.

XSD лучше улавливает ошибки, чем XML.

xsd-файл определяет элемент, которые могут быть использованы в документах, относящихся к фактическим данным, с которыми он должен быть закодирован.
например:
Дата, выраженная как 1/12/2010, может означать либо 12 января, либо 1 декабря. Объявление типа данных даты в документе XSD гарантирует, что он соответствует формату, продиктованному XSD.

в XML-против xsd-схемы

в основном xsd-файл определяет, как будет выглядеть XML-файл. Это - схемы, который определяет структуру XML-файла. Таким образом, он определяет, какие возможные поля и какой размер они будут.

XML-файл экземпляр XSD, поскольку он использует правила, определенные в XSD.

Читайте также: