XSD: в чем разница между пространством имен и пространством имен по умолчанию

#xml #namespaces #xsd #xml-namespaces

#xml #пространства имен #xsd #xml-пространства имен

Вопрос:

Возможно, название вопроса вводит в заблуждение, и это потому, что я не мог объяснить свою проблему в однострочном предложении.

В учебном пособии w3school есть этот пример:

 <?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.w3schools.com"
           xmlns="http://www.w3schools.com"
           elementFormDefault="qualified">
    ...
    ...
</xs:schema>
 

Автор заявил, что: xmlns:xs="http://www.w3.org/2001/XMLSchema" означает:

элементы и типы данных, используемые в схеме, поступают из «http://www.w3.org/2001/XMLSchema » пространство имен. Он также указывает, что элементы и типы данных, которые поступают из «http://www.w3.org/2001/XMLSchema » пространство имен должно иметь префикс xs.

Однако автор также заявил, что targetNamespace="http://www.w3schools.com" это означает:

элементы, определенные этой схемой (примечание, кому, откуда, заголовок, тело.) поступают из «http://www.w3schools.com » пространство имен.

У меня проблема с пониманием предыдущих абзацев. В первом указано, что элементы поступают из http://www.w3.org/2001/XMLSchema пространства имен, хотя во втором абзаце указано, что элементы поступают из http://www.w3schools.com пространства имен.

На мой взгляд, эти два предложения конфликтуют друг с другом.

Не могли бы вы сказать мне, пожалуйста, какой из них правильный? и что на самом деле означает каждое из них?

Я ценю ваше время.

С уважением,

Ответ №1:

Пространства имен по умолчанию, полные имена и префиксы

Пространство имен по умолчанию — это то, которое не сопоставлено ни с каким префиксом. Вы объявляете его с помощью:

 xmlns="a-string-that-is-usually-an-uri"
 

Если у вас есть такое объявление в XML-файле, любой элемент без префикса будет принадлежать этому пространству имен. Атрибуты без префикса всегда не принадлежат ни одному пространству имен.

В документе XML может быть несколько объявлений пространства имен, но только одно пространство имен по умолчанию в каждой области. Вам также не нужно иметь какое-либо пространство имен по умолчанию. Область видимости состоит из самого элемента и его потомков. В приведенном ниже документе есть два пространства имен по умолчанию. ns2 Пространство имен заменяет ns1 элемент, в котором оно объявлено, и его потомки:

 <root xmlns="ns1">
    <text>This is ns1</text>
    <child xmlns="ns2">
        <text>This is ns2</text>
    </child>
</root>
 

В приведенном выше документе есть два <text> элемента. На самом деле это совершенно разные элементы, поскольку каждый из них принадлежит другому пространству имен. Они имеют одинаковое локальное имя, но их полные имена отличаются.

Если у вас есть объявление для того же пространства имен, например:

 xmlns:p="a-string-that-is-usually-an-uri"
 

Вы сопоставляете пространство имен с префиксом p , который может использоваться любым элементом в контексте (учитывая правильно сформированный документ, не обязательно действительный). Для допустимого документа элементы, являющиеся частью пространства имен, должны быть квалифицированы им либо как потомок (или self) без префикса элемента, который объявляет пространство имен по умолчанию, либо как потомок (или self) с префиксом элемента, который объявляет сопоставление пространства имен с этим префиксом. Префиксы также могут использоваться для определения атрибутов.

Используя префиксы, вы можете иметь все объявления в корневом элементе, а квалифицированные элементы могут смешиваться:

 <root xmlns:p="ns1" xmlns:q="ns2" xmlns="ns0">
    <p:text>This is ns1</p:text>
    <q:child xmlns="ns2">
        <q:text>This is ns2</q:text>
        <p:text>This is ns1 again!</p:text>
        <text>This is ns0</text>
    </q:child>
</root>
 

Каждый из вышеперечисленных <text> элементов является частью другого пространства имен.

Найдите время, чтобы прочитать это руководство: Понимание пространств имен XML. Оно короткое, и если вы внимательно его прочтете, то наверняка поймете, как пространства имен в XML работают очень хорошо. При желании вы также можете прочитать спецификацию пространств имен XML, которая является официальной документацией.

Целевые пространства имен в XSD

Об учебном пособии, которое вы читаете. Этот файл:

 <?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.w3schools.com"
           xmlns="http://www.w3schools.com"
           elementFormDefault="qualified">
    ...
    ...
</xs:schema>
 

имеет два объявления пространства имен и одно объявление целевого пространства имен. Поскольку это также схема, она содержит определения типов, которые будут принадлежать целевому пространству имен. Это может сбивать с толку, поскольку схема представляет собой XML-документ, в котором объявляются правила для других XML-документов с использованием XML. Рассматривая документ XSD как обычный XML-документ, у вас есть одно пространство имен, сопоставленное с xs префиксом, а другое — пространство имен по умолчанию. Вы также могли юридически использовать разные префиксы:

 <abc:schema xmlns:abc="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.w3schools.com"
           xmlns:xyz="http://www.w3schools.com"
           elementFormDefault="qualified">
    <abc:complexType name="MyType"> ...</abc:complexType>
    <abc:element name="myElementOne" type="xyz:MyType" />
    <abc:element name="myElementTwo" type="abc:string" />
</abc:schema>
 

Если вы внимательно посмотрите на приведенный выше пример, вы можете увидеть ассоциации:

  1. schema Элементы complexType element и плюс string тип принадлежат http://www.w3.org/2001/XMLSchema пространству имен.
  2. В схеме нет элементов или атрибутов, которые принадлежат http://www.w3schools.com пространству имен, поскольку это схема, и она фактически определяет эти элементы.
  3. MyType Сложный тип является частью http://www.w3schools.com пространства имен. Это потому, что оно объявляется в схеме, а targetNamespace в схеме есть http://www.w3schools.com . Поскольку это пространство имен сопоставляется с xyz префиксом, то вам нужно, чтобы prefix при обращении к нему это происходило в type атрибуте первого элемента, точно так же, как type атрибут второго элемента ссылается на string тип http://www.w3.org/2001/XMLSchema пространства имен.

Вы также могли бы написать приведенную выше схему следующим образом. Это не имело бы никакого значения:

 <schema xmlns="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.w3schools.com"
           xmlns:xyz="http://www.w3schools.com"
           elementFormDefault="qualified">
    <complexType name="MyType"> ...</complexType>
    <element name="myElementOne" type="xyz:MyType" />
    <element name="myElementTwo" type="string" />
</schema>
 

Теперь обратите внимание, что существует пространство имен по умолчанию, и это http://www.w3.org/2001/XMLSchema , поэтому все типы и элементы этого пространства имен не имеют префиксов.

Однако лучше всего следовать соглашениям и сопоставлять префикс с пространством имен XSD (обычно xs или xsd ).

О конфликтующих предложениях

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

элементы и типы данных, используемые в схеме, поступают из «http://www.w3.org/2001/XMLSchema » пространство имен. Он также указывает, что элементы и типы данных, которые поступают из «http://www.w3.org/2001/XMLSchema » пространство имен должно иметь префикс xs.

Рассматривайте документ XSD как обычный XML-файл. В любом XML-файле объявление пространства имен, такое как xmlns=»ns1″ в корневом элементе, объявляет, что элементы без префиксов поступают из пространства имен по ns1 умолчанию. В случае, описанном в предложении, автор ссылается на все элементы с префиксами (такие как element , complexType , , последовательность ) and types (such as простого типа строка , целое , десятичное ) because the число префикс xs сопоставляется с пространством имен XSD. Автор говорит об элементах и типах, используемых в файле XML, а не определенных.

Следующее предложение касается targetNamespace , который является атрибутом, специфичным для спецификации XSD. Он объявляет пространство имен всех типов:

targetNamespace=»http://www.w3schools.com » означает, что элементы, определенные этой схемой (примечание, кому, откуда, заголовок, тело.) поступают из «http://www.w3schools.com » пространство имен.

Это относится к именам, которые вы присваиваете типам и элементам. Когда вы создаете экземпляр, который объявляет это пространство имен, вы будете использовать эти элементы:

 <note xmlns="http://www.w3schools.com">...</note>
 

или

 <x:note xmlns:x="http://www.w3schools.com">...</x:note>
 

Но в XSD вы их определяете. Вам даже не нужно объявлять xmlns="http://www.w3schools.com" в схеме, если вы никогда не ссылаетесь (используя такие атрибуты type , как ref , и т.д.) На любой другой тип или элемент, который вы создали внутри него.

Комментарии:

1. могу ли я добавить xmlns="xs" и написать более совместимый XSD?

Ответ №2:

    default namespace serve only one purpose, it allows use of namespace qualified xml components without namespace prefix. 
 

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