Поиск…


замечания

Имена элементов и атрибутов в XML называются QNames (квалифицированные имена).

QName состоит из:

  • пространство имен (URI)
  • префикс (NCName, NC, потому что он не содержит двоеточия)
  • локальное имя (NCName)

Для сравнения двух QNames релевантно только пространство имен и локальное имя. Префикс является только прокси-сервером для пространства имен.

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

Лексическое представление QName является prefix:local-name . Пространство имен привязывается отдельно с использованием специальных атрибутов xmlns:... (напоминание: атрибуты, начинающиеся с xml , зарезервированы в XML).

Если префикс пуст, в лексическом представлении QName не используется двоеточие, которое содержит только local-name . QNames с пустым префиксом либо не имеют пространства имен (если пространство имен по умолчанию не задано), либо находятся в пространстве имен по умолчанию.

Привязать префикс к пространству имен

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

В следующем примере префикс my-prefix привязан к пространству имен http://www.example.com/my-namespace с помощью специального атрибута xmlns:my-prefix ( my-prefix можно заменить любым другим префиксом) :

<?xml version="1.0"?>
<my-prefix:foo xmlns:my-prefix="http://www.example.com/my-namespace">
  <!-- the element my-prefix:foo
       lives in the namespace http://www.example.com/my-namespace -->
</my-prefix:foo>

Отсутствие пространства имен

В XML имена элементов и атрибутов находятся в пространствах имен.

По умолчанию они не имеют пространства имен:

<?xml version="1.0"?>
<foo attr="value">
  <!-- the foo element is in no namespace, neither is the attr attribute -->
</foo>

Неприемлемость префиксов

Эти два документа являются семантически эквивалентными, поскольку пространства имен имеют значение, а не префиксы.

<?xml version="1.0"?>
<myns:foo xmlns:myns="http://www.example.com/my-namespace">
</myns:foo>

<?xml version="1.0"?>
<ns:foo xmlns:ns="http://www.example.com/my-namespace">
</ns:foo>

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

По умолчанию пространство имен - это пространство имен, соответствующее отсутствию какого-либо префикса. Он может быть объявлен с помощью специального атрибута xmlns .

<?xml version="1.0"?>
<foo xmlns="http://www.example.com/my-namespace">
  <!-- the element foo is in the namespace
       http://www.example.com/my-namespace -->
</foo>

Если не объявлено пространство имен по умолчанию, имена без префикса не имеют пространства имен.

Имена атрибутов без префикса

Элементы и атрибуты ведут себя по-разному относительно пространств имен по умолчанию. Это часто является источником путаницы.

Атрибут, имя которого не имеет префикса, не живет в пространстве имен, также когда пространство имен по умолчанию находится в области видимости .

<?xml version="1.0"?>
<foo attr="value" xmlns="http://www.example.com/my-namespace">
  <!-- The attribute attr is in no namespace, even though
       a default namespace is in scope. The element foo,
       however, is in the default namespace. -->
</foo>

Область привязки пространства имен

Связывание пространства имен (специальный атрибут xmlns или xmlns:... ) является видимым для всех потомков охватывающего элемента, включая этот элемент.

<?xml version="1.0"?>
<root>
  <my:element xmlns:my="http://www.example.com/ns1">
    <!-- here, the prefix my is bound to http://www.example.com/ns1 -->
  </my:element>
  <my:element xmlns:my="http://www.example.com/ns2">
    <!-- here, the prefix my is bound to http://www.example.com/ns2 -->
  </my:element>
</root>

Связывание может быть переопределено во вложенном элементе (это, однако, влияет на читаемость):

<?xml version="1.0"?>
<my:element xmlns:my="http://www.example.com/ns1">
  <!-- here, the prefix my is bound to http://www.example.com/ns1 -->
  <my:first-child-element/>

  <my:child-element xmlns:my="http://www.example.com/ns2">
    <!-- here, the prefix my is bound to http://www.example.com/ns2,
         including for the element my:child-element -->
  </my:child-element>

  <!-- here, the prefix my is bound to http://www.example.com/ns1 -->
  <my:last-child-element/>

</my:element>

Очень часто объявлять все привязки пространств имен в корневом элементе, что улучшает читаемость.

<?xml version="1.0"?>
<root
  xmlns="http://www.example.com/default-namespace"
  xmlns:ns1="http://www.example.com/ns1"
  xmlns:ns2="http://www.example.com/ns2">
  
  <ns1:element>
    <ns2:other-element/>
  </ns1:element>

</root>


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow