xml
Пространства имен
Поиск…
замечания
Имена элементов и атрибутов в 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>