Вопрос:
Я новичок в XML-схеме и просматриваю документы схемы, которые связывают несколько префиксов с различными пространствами имен в корневом элементе xsd:schema, а также импортируют подмножество таких схем. В остальной части документа XML Schema они с радостью используют все префиксы, связанные в элементе xsd:schema (независимо от того, импортированы они или нет).
Итак, что означает, что import пространства имен означает “просто” привязывает это пространство имен к префиксу?
Из Окончательная схема XML, которую я прочитал (стр. 66):
импорт используется для указания процессору, что вы будете ссылаться на компоненты из других пространств имен
В моем понимании, что и что делает привязка, так какая разница?
конкретный пример
<?xml version=»1.0″ encoding=»UTF-8″?> <xs:schema xmlns:xs=»http://www.w3.org/2001/XMLSchema» xmlns:vr=»http://www.ivoa.net/xml/VOResource/v1.0″ xmlns:ssap=»http://www.ivoa.net/xml/SSA/v1.0″ xmlns:vm=»http://www.ivoa.net/xml/VOMetadata/v0.1″ targetNamespace=»http://www.ivoa.net/xml/SSA/v1.0″ elementFormDefault=»unqualified» attributeFormDefault=»unqualified» version=»1.0pr2″> <xs:import namespace=»http://www.ivoa.net/xml/VOResource/v1.0″ schemaLocation=»http://www.ivoa.net/xml/VOResource/v1.0″/> <!— … rest of the schema document follows —>
Пространство имен http://www.ivoa.net/xml/VOResource/v1.0 в приведенном выше документе схемы привязано к префиксу vr и импортируется. Другие пространства имен привязаны только к определенным префиксам и не импортируются. В остальной части документа используются компоненты из vr (связанных и импортированных) и ssa (связанных, но не импортированных) префиксов. Какая разница?
Лучший ответ:
Если есть ссылка на компонент, такой как vr:someType, то:
-
вам нужно объявление пространства имен, чтобы процессор знал, какое пространство имен vr ссылается на
-
вам нужно объявление импорта, чтобы процессор знал, где найти компонент vr:someType
Это немного упрощение. Теоретически импорт не говорит процессору, где искать; schemaLocation – это всего лишь “подсказка”. На практике для большинства процессоров schemaLocation является либо фактическим расположением документа схемы, либо URI, который может быть перенаправлен (например, с использованием каталога) в фактическое местоположение.
Спецификация могла бы допускать существование таких ссылок, как vr:someType, без импорта, опираясь на механизмы, определенные реализацией, для нахождения компонентов схемы для определенного пространства имен. Но это не позволяет этого.
Ответ №1
Ну, вам нужно перейти к основам XML, чтобы понять все эти вещи…
Действительное имя XML (т.е. элемент или атрибут… или некоторый компонент XSD,
например complexType или group) на самом деле не то, что вы видите в определенном XML файле (или XML-схеме). Вы видите что-то вроде этого:
xs:schema
и вы считаете, что имя < схема > элемент.
Но на самом деле настоящее имя этого элемента (с которым работает парсер/процессор XML):
{http://www.w3.org/2001/XMLSchema}schema
Вещь в фигурных скобках означает namespace, которая является эффективной частью полного имени.
Пространства имен необходимы, поскольку, например, < схема > элемент, упомянутый здесь, является частью языка XSD, предоставляемой и поддерживаемой W3C. Но предположим, что у кого-то еще есть какие-то схемы (например, схема работы какой-то большой организации) и хочет описать эти схемы со своей собственной <schema> элементы. Более того, они могут в конечном итоге иметь как <schema> элементы (т.е. их собственные и W3C) в том же файле XML. Как, разделитель XML различает их?
Здесь используются пространства имен. Они позволяют распространять локальные XML-имена (используемые в XML) с чем-то другим, некоторые дополнительные строки достаточно долго, чтобы гарантировать, что они всегда одинаковы в любом XML файле на Земле. Эти длинные строки называются URI пространства имен, и это то, что вы видите в фигурных скобках выше.
Но вы были бы счастливы, если бы ваш XML файл заполнялся такими именами:
{http://www.w3.org/2001/XMLSchema}schema
Вы ничего не сможете прочитать, верно?
XML предоставляет возможность обойти эту проблему.
Вместо того, чтобы писать весь URI пространства имен вместе с каждым именем XML, вам просто нужно объявить для него несколько ярлыков. Этот ярлык называется префиксом пространства имен, и вы объявляете его со специальным атрибутом привязки xmlns:… например:
xmlns:xs=»http://www.w3.org/2001/XMLSchema»
Здесь xs – это префикс (который представляет пространство имен). Теперь вы можете писать везде просто:
xs:schema
Сам префикс пространства имен является локальным (локальным для вашего XML файла).
Вы можете одинаково использовать любую другую строку для этого, например. ‘XSD’:
xmlns:xsd=»http://www.w3.org/2001/XMLSchema»
и напишите затем
xsd:schema
Корневой XML-элемент обычно содержит декларации всех привязок пространств имен, используемых в данном XML (хотя это необязательно; привязка действительна для содержимого XML-элемента, в котором оно объявлено).
Конечно, некоторые XML файлы (и XSD) могут содержать привязки пространства имен, которые никогда не используются позже. Это не ошибка. Но это своего рода неопрятная работа (такая же, как неиспользуемые переменные в программе).
Теперь для чего нужен элемент import? Он просто импортирует внешнюю схему XML в вашу схему. Импорт означает, что теперь вы можете использовать в своих собственных объявлениях любые глобальные компоненты, определенные в этой импортированной схеме.
Но помните, что вы всегда работаете с полными именами XML (то есть локальным именем + URI пространства имен), потому что процессор схемы делает это. Импортированная внешняя схема описывает элементы (компоненты) в другом пространстве имен. Если вы хотите ссылаться на эти компоненты, вам нужно сообщить процессору XML об их пространстве имен, который вы используете через префикс пространства имен, который вы связываете с импортированным URI пространства имен в вашем XML.
Элемент import имеет два атрибута:
<xs:import namespace=»http://www.ivoa.net/xml/VOResource/v1.0″ schemaLocation=»http://www.ivoa.net/xml/VOResource/v1.0″/>
Атрибут namespace указывает URI пространства имен того, что вы импортируете. Элемент import фактически должен импортировать только разные пространства имен (не часть того, который вы описываете с помощью вашей схемы, для этого есть еще один элемент XSD: include). Итак, что вы делаете с import, называется импортом пространства имен.
Атрибут schemaLocation сообщает парсеру схемы физическое местоположение файла импортированной схемы (XSD). Это необязательный атрибут. В некоторых программах XML-схемы могут храниться локальные копии XML-схем, описывающих некоторые важные пространства имен (в частности, поддерживаемые W3C). Таким образом, только URI пространства имен может быть достаточно, чтобы намекнуть, где они должны взять соответствующий файл XSD.
Короче:
-
Что означает связывание пространства имен? Это позволяет ввести короткий (префикс пространства имен) для URI пространства имен (который является длинной строкой). Добавляя префикс пространства имен к локальному имени, вы указываете процессору XML, которому принадлежит пространство имен, к которому принадлежит XML. Здесь “пространство имен” является абстрактным понятием. Он просто расширяет любые имена XML, чтобы сделать их абсолютно уникальными. Однако привязка пространства имен не предполагает, что существуют какие-либо схемы с любыми компонентами, определенными для этого пространства имен!
-
Что делает элемент XSD import? Он импортирует все глобальные компоненты, определенные в определенном пространстве имен (в XML-схеме cetain) и делает их доступными в вашей схеме. Это не имеет никакого отношения к привязкам определенных префиксов к URI!