Открыть сервис

XML Namespaces

XML Namespaces — это механизм, предназначенный для различения элементов и атрибутов, имеющих одинаковые локальные имена, но происходящих из разных словарей (схем) в языке разметки XML. Основная цель пространств имён — избежать конфликтов имён при объединении XML-документов, содержащих данные из нескольких источников, и обеспечить однозначную идентификацию семантики каждого элемента.

История и стандартизация

Проблема конфликта имён возникла с развитием XML как универсального формата обмена данными. Разные организации и сообщества разрабатывали собственные XML-словари (например, XHTML, SVG, MathML), и при их совместном использовании в одном документе элементы с одинаковыми именами (например, <title> в XHTML и <title> в SVG) могли иметь разный смысл.

Для решения этой проблемы Консорциум Всемирной паутины (W3C) разработал спецификацию «Namespaces in XML». Первая версия (1.0) стала рекомендацией W3C 14 января 1999 года. Вторая версия (1.1) была опубликована 16 августа 2006 года и внесла уточнения, в частности, касающиеся объявления пространств имён по умолчанию в пустых элементах и обработки атрибутов. Стандарт является основополагающим для всех современных технологий на основе XML, таких как XSLT, XPath, SOAP и WSDL.

Принцип работы

Пространство имён идентифицируется с помощью URI (Uniform Resource Identifier). Хотя часто используется URL (Uniform Resource Locator), URI не обязательно должен указывать на реально существующий веб-ресурс; это просто уникальное имя. Для удобства чтения и записи URI связывается с коротким префиксом.

Объявление пространства имён

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

Существует два способа объявления:

  1. Пространство имён по умолчанию (Default Namespace): Используется атрибут xmlns без префикса. Все элементы, не имеющие префикса, считаются принадлежащими этому пространству имён. Атрибуты без префикса пространству имён по умолчанию не принадлежат.

``xml <html xmlns="http://www.w3.org/1999/xhtml">; <body> <p>Текст параграфа.</p> </body> </html> ` В этом примере элементы html, body и p` находятся в пространстве имён XHTML.

  1. Префиксное пространство имён (Prefixed Namespace): Используется атрибут xmlns:префикс. Префикс — это произвольное, но допустимое в XML имя, которое затем ставится перед именем элемента или атрибута через двоеточие (префикс:локальное_имя).

``xml <root xmlns:book="urn:isbn:0-395-36341-1"> <book:title>Война и мир</book:title> <book:author>Лев Толстой</book:author> </root> ` Здесь префикс book связан с URI urn:isbn:0-395-36341-1. Элементы title и author` явно квалифицированы этим префиксом.

Область действия (Scope)

Область действия объявления пространства имён — это элемент, в котором оно сделано, и все его потомки. Объявление может быть переопределено во вложенном элементе, изменив URI для данного префикса или для пространства имён по умолчанию.

``xml <root xmlns:ns="http://example.com/a">; <ns:item>Элемент из пространства A</ns:item> <section xmlns:ns="http://example.com/b">; <ns:item>Элемент из пространства B</ns:item> </section> <ns:item>Снова элемент из пространства A</ns:item> </root> ``

Квалифицированные имена (QName)

QName (Qualified Name) — это полное имя элемента или атрибута, состоящее из префикса пространства имён и локального имени, разделённых двоеточием. Например, xsl:template — это QName, где xsl — префикс, а template — локальное имя. Внутренне процессор XML сопоставляет префикс с URI, и элемент идентифицируется парой {URI пространства имён}локальное_имя, например, {http://www.w3.org/1999/XSL/Transform}template`.

Применение и значение

Разрешение конфликтов имён

Основное и наиболее очевидное применение. Позволяет в одном документе смешивать элементы из разных схем без двусмысленности.

Технологии на основе XML

  • XSLT (XSL Transformations): Использует пространства имён для различения инструкций преобразования (xsl:template, xsl:value-of) и выходных данных (например, HTML-элементов).
  • XPath (XML Path Language): Позволяет адресовать узлы в документе с учётом их пространств имён. Для этого в XPath-выражениях также используются префиксы, которые должны быть предварительно объявлены.
  • SOAP (Simple Object Access Protocol): Протокол обмена сообщениями, где пространства имён используются для отделения структуры SOAP-конверта (Envelope, Header, Body) от данных приложения.
  • WSDL (Web Services Description Language): Язык описания веб-сервисов, активно использующий пространства имён для разделения абстрактных определений (типов, сообщений) и конкретных привязок к протоколам.

Семантика и версионирование

URI пространства имён часто используется для указания версии схемы. Например, http://www.w3.org/2001/XMLSchema` — это пространство имён для схемы XML Schema (XSD) версии 1.0. Изменение URI обычно сигнализирует о несовместимых изменениях в схеме.

Критика и ограничения

Несмотря на широкое распространение, механизм пространств имён подвергается критике:

  • Сложность синтаксиса: Использование префиксов и двоеточий делает XML-документы менее читаемыми для человека, особенно при большом количестве разных пространств имён.
  • Проблема с URI: Использование URL в качестве URI создаёт ложное впечатление, что по этому адресу должна быть доступна схема или документация, хотя стандарт этого не требует. Это может приводить к путанице.
  • Обработка атрибутов: Атрибуты без префикса не наследуют пространство имён по умолчанию, что часто является неочевидным для разработчиков и источником ошибок.
  • Сложность реализации: Корректная обработка пространств имён требует от XML-парсера дополнительной логики, что усложняет его реализацию по сравнению с простым синтаксическим анализом.

Пример: Смешение XHTML и SVG

``xml <html xmlns="http://www.w3.org/1999/xhtml">; <head> <title>Пример с SVG</title> </head> <body> <p>Текст до SVG-изображения.</p> <svg xmlns="http://www.w3.org/2000/svg"; width="100" height="100"> <circle cx="50" cy="50" r="40" stroke="green" stroke-width="4" fill="yellow" /> </svg> <p>Текст после SVG-изображения.</p> </body> </html> ` В этом документе элементы html, head, title, body, p принадлежат пространству имён XHTML, а элемент svg и circle — пространству имён SVG. Конфликта для элемента title не возникает, так как он находится в разных контекстах (XHTML и SVG), хотя в данном примере SVG-элемент title` не используется.

Источники

  • W3C Recommendation: Namespaces in XML 1.0 (Third Edition)
  • W3C Recommendation: Namespaces in XML 1.1 (Second Edition)
  • Extensible Markup Language (XML) 1.0 (Fifth Edition)
  • XML Schema Part 1: Structures Second Edition

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →