что такое пространство имен в xml
Постановка проблемы
Технология XML предоставляет разработчикам при создании XML документов возможность использовать элементы и атрибуты с любыми названиями (естественно при соблюдении определенных синтаксических правил). Поэтому очень часто возникает проблема неоднозначности. В русском, английском, да и, наверное, практически во всех языках достаточно широко встречаются слова омонимы, т.е. слова, которые пишутся одинаково, но имеют разный смысл.
Возьмем известную всем с детства скороговорку: «Запер замок на замок, чтобы замок не замок«. Мы видим – слово замок употребляется четыре раза, в трех совершенно разных смыслах: 1) здание; 2) устройство, обеспечивающее защиту входа; 3) результат действия попадания воды.
В приведенных выше примерах одинаковые по написанию слова имеют разный смысл, и определить контекст их использования не представляет особого труда. Однако достаточно часто могут встретиться более тонкие ситуации, когда слово имеет одно базовое понятие, но в рамках этого понятия могут возникнуть нюансы, требующие уточнения контекста.
Например, возьмем слово сеть. Независимо от того, является сеть инструментом для ловли рыбы, множеством торговых представителей фирмы, или объединенных каналами компьютеров, понятие самого слова сеть в узком смысле остается одинаковым. Это связанные в определенную структуру узлы, Тем не менее, если мы разрабатываем XML документ, описывающий сеть дилеров, распространяющих оборудование и программы для компьютерных сетей, то необходимо четко задать соответствующие контексты. Возможно также контекст, описывающий оборудование и программы для сетей, с целью устранения конфликтов в понятиях и терминах, рассматривать не как единый, а разделить на два контекста: отдельно для сетевого оборудования, и отдельно для сетевых программ.
Разбирая примеры, мы основывались на том, что человек интуитивно понимает, в каком контексте используется слово и скрывающееся за ним понятие, но компьютерная программа, которая будет обрабатывать XML документ не человек. Для нее контекст, определяющий понятия, которые используются в XML документе, должен быть задан четко. Все проблемы неясностей и коллизий имен должны быть решены.
Понятие пространства имен
В предыдущем разделе мы в основном говорили о контексте относительно конкретных слов и понятий. Однако контекст слова или понятия формируется не абстрактно, а зависит от предметной области, к которой он принадлежит. Например, если мы берем предметную область «локальные сети», то под словом сеть будет пониматься компьютерная сеть, охватывающая небольшую территорию, обладающая определенной топологией, скоростью передачи.
Задание пространства имен в XML документе
При задании пространства имен в XML документе необходимо иметь в виду следующее:
· элементы и атрибуты связываются с пространством имен с помощью квалифицированных имен;
· в одном XML документе может быть задано несколько пространств имен;
· область действия пространства имен может распространяться:
o на весь документ;
o отдельный элемент или атрибут.
Область действия пространства имен распространяется на весь документ, когда оно задано в корневом элементе XML документа.
Область действия пространства имен распространяется на конкретный контейнер и все, вложенные в него элементы и атрибуты, когда оно задано в элементе верхнего уровня контейнера.
Область действия пространства имен распространяется на отдельный элемент или атрибут, когда оно задано непосредственно для данного элемента и атрибута.
Пример для всех трех способов задания области действия пространства имен дан в следующем разделе.
Связывание элементов и атрибутов XML документа с пространством имен.
prefix – это квалифицированное имя, посредством которого элементы и атрибуты XML документа связываются с пространством имен;
В том случае, если параметр prefix не задан, то объявленное пространство имен будет использоваться как пространство имен по умолчанию.
Пример задания пространства имен.
Пространство имен и схемы
Смешение словарей
Когда вы используете полезные для вас определения из DTD других разработчиков или комбинируете сегментированные DTD для создания документа, описывающего сложную проблему, если в ваших документах используются элементы с одинаковыми именами, вы рискуете столкнуться с проблемой неясности и коллизии имен.
Пространства имен
Пространства имен способны помочь пользователю в двух очень важных случаях. С их помощью можно:
Пространство имен представляет собой совокупность некоторых величин или характеристик, которые могут быть использованы в XML-документах как имена элементов или атрибутов. Пространства имен в XML определяются унифицированным идентификатором ресурса URI (в качестве URI можно использовать адрес DTD на вашем сервере). Он позволяет каждому пространству имен быть уникальным.
Итак, для того чтобы эффективно использовать пространства имен в документе, комбинирующем элементы из различных источников, нам надо определить:
Использование и декларация пространств имен
Декларация пространства имен
Кроме того, в одном теге могут встречаться сразу несколько пространств имен. Ниже приводится пример смешения нескольких пространств имен:
Имя вместе с префиксом, например
называется расширенным, уточненным или квалифицированным именем ( OName. Qualified Name ). Часть имени, записанная после двоеточия, называется локальной частью ( local part ) имени.
Во вложенных элементах пространство имен можно переопределить, связав префикс с другим идентификатором.
Появление имени тега без префикса в документе, использующем пространство имен, означает, что имя принадлежит пространству имен по умолчанию ( default namespace ).
Хорошо оформленный документ должен использовать пространства имен для всех своих элементов.
Пока есть только два атрибута с префиксом xml. Для каждого элемента верного документа, в котором используются эти атрибуты, они должны быть объявлены в описании DTD ( Document Type Definition ).
Атрибут xml:space указывает программе-обработчику, как следует обрабатывать пробельные символы (пробелы, знаки горизонтальной табуляции и символы перевода строки), записанные в содержимом элемента. У атрибута есть всего два значения. Значение preserve предписывает сохранять пробельные символы в неприкосновенности. Это важно для некоторых текстов, например, программных кодов. Значение default оставляет пробельные символы на усмотрение программы-обработчика.
Область действия
У деклараций пространств имен имеется область действия, так же, как у деклараций переменных в языках программирования. Это важно, так как пространства имен не всегда декларируются в начале документа XML, иногда это делается в последующих его разделах. Декларация пространства имен применима к элементу, в котором она появляется, а также к потомкам этого элемента, даже если она не определена там явным образом. Имя может ссылаться на пространство имен, только если используется в области действия его декларации.
Однако нам потребуется также смешивать области действия пространств имен в элементах, которые в противном случае наследовали бы другие пространства имен. В связи с этим определены два способа декларации области действия- default (по умолчанию) и qualified (квалифицированный).
Область действия по умолчанию
Как и следовало ожидать, необходимость добавления префикса к каждому имени в документе быстро становится утомительной. Фактически, введя концепцию области действия имени, мы можем смешивать в нашем документе большое количество префиксов. Если мы определяем пространство имен по умолчанию, то предполагается, что ему принадлежат все неквалифицированные имена внутри области действия его декларации. Таким образом, пространство имен, объявленное по умолчанию в корневом элементе, считается пространством по умолчанию для всего документа и может быть перекрыто только более специфическим пространством имен, объявленным внутри документа.
Чтобы пространство имен сделать пространством имен по умолчанию для некоторой области, достаточно опустить декларацию префикса.
Если префикс объявлен, а затем использован совместно с именем, то говорят что пространство имен явным образом установлено. Чтобы отнести к пространству имен неквалифицированное имя, необходимо объявить пространство по умолчанию, которое включает это неквалифицированное имя (без префикса).
Квалифицированная область действия
Описанный выше метод работает хорошо, если вы можете четко разделить ваши пространства имен. Но иногда бывает необходимо включить в документ отдельные имена из внешних пространств имен. Вместо того чтобы декларировать пространства имен для целой области, можно использовать квалифицированные имена. Объявите нужные вам пространства имен в начале документа, а затем квалифицируйте их в месте использования.
Что такое пространство имен в xml
Из самого определения языка XML вытекает, что основным его достоинством является возможность определять собственные имена элементов и их атрибутов. Набор таких имен, определенных в DTD специализированного XML-языка, называется его словарем. Однако, произвольность создания словарей приводит к тому, что они зачастую содержат одинаковые имена для различных сущностей. Рассмотрим следующий пример:
Здесь присутствуют элемент title (название книги) и атрибут title (название денежной единицы), которые явно относятся к разным словарям. Но то, что очевидно для человеческого глаза, недоступно XML-процессору, проводящему формальный анализ документа. Для того, чтобы избежать двусмысленностей в XML-документе, который пользуется несколькими словарями, и были введены пространства имен (namespaces), описанные в этой главе.
По существу, пространство имен XML это словарь, идентифицируемый ссылкой на URI ресурса, содержащего описание данного словаря. Каждому такому словарю приписывается префикс пространства имен, уникальный в пределах данного документа. Теперь, чтобы избежать двусмысленности, мы можем использовать полные формы имен элементов и атрибутов, которые состоят из префикса, указывающего на пространство имен, двоеточия и собственно имени. Такое ограниченное имя (qualified name) однозначно идентифицирует элемент или атрибут и указывает, к какому пространству имен он относится.
8.3.2. Декларация простанства имен
Существует два способа декларации пространства имен: декларация по умолчанию и явная декларация. Декларация по умолчанию объявляет пространство имен для всех элементов и их атрибутов, которые содержатся в данном элементе. Она имеет вид:
где xmlns ключевое слово XML, а URI это адрес ресурса, содержащего соответствующий словарь. В следующем примере элемент book и все элементы и атрибуты внутри него будут браться XML-анализатором из пространства имен «http://www.booker.com/schema».
Явная декларация имеет вид:
Здесь элемент book содержит декларации двух пространств имен: первое из них имеет префикс bk, второе money. При этом содержащиеся в нем элементы title и author относятся к первому пространству имен, а price и его атрибут title ко второму.
Из приведенных примеров видно, что декларация пространства имен выглядит как обычный атрибут со специальным именем xmlns, но может содержать дополнительно префикс, который позволяет нам уточнять, к какому пространству относится то или иное имя. Как отмечено выше, имена с префиксом (типа bk:author) называются ограниченными. При этом имя, следующее за двоеточием, называется локальным. Элементы и атрибуты, чьи имена не содержат префикса, считаются относящимися к пространству имен по умолчанию.
Следует также отметить, что URI пространства имен не обязан указывать на реальный ресурс (фактически, содержимое URI извлекается процессором только в случае схем); в большинстве случаев он просто служит идентификатором данного пространства, т. к. два пространства имен считаются одинаковыми тогда и только тогда, когда их URI текстуально совпадают.
Существует особый префикс xml, который не требует декларации. Он зарезервирован для расширений языка XML и всегда относится к пространству имен «http://www.w3.org/XML/1998/namespace». Пример использования этого префикса приведен ниже.
8.3.3. Область действия пространства имен
Пространство имен действует только в пределах того элемента, атрибутом которого является его декларация. Рассмотрим на примере, что это означает.
В этом примере имена элементов не ограничены, т. е. не имеют префиксов. Поэтому элемент Trees не относится ни к какому пространству имен, элементы tr и td относятся к пространству имен «http://www.w3.org/TR/REC-html40», а все остальные элементы к пространству имен «http://flora.com/trees».
При использовании пространств имен важно учитывать, что атрибуты элемента не наследуют его пространство имен. Иными словами, если префикс пространства имен для атрибута не указан, то его имя не относится ни к какому пространству имен.
8.3.4. Базовые URI фрагментов XML-документа
Пространства имен в XML были, в частности, использованы для задания в XML-документе базового URI любого из его фрагментов. Как мы помним, в HTML для этого используется элемент BASE, однако он относится к HTML-документу в целом. XML в этом отношении более гибок; в нем мы можем задать базовый URI любого элемента с помощью атрибута xml:base следующего вида (напомним, что префикс xml относится к пространству имен «http://www.w3.org/XML/1998/namespace»):
Рассмотрим такой пример:
Здесь корневой элемент doc содержит указание на свой базовый URI «http://example.org/today/», а относительные URI вложенных в него элементов будут разрешаться так:
Тепеь мы можем сформулировать строгие правила описания базовых URI. Во-первых, их синтаксис и семантика сооответствуют общим правилам, принятым для URI (см. Приложение 2). Во-вторых, действуют следующие соглашения о присвоении элементам базовых URI:
Наконец, в-третьих, относительные URI разрешаются в полные так же, как все относительные URI, но со следующими уточнениями:
Оператор Imports (пространство имен XML)
Импортирует префиксы пространства имен XML для использования в XML-литералах и свойствах осей XML.
Синтаксис
Компоненты
xmlNamespaceName
Обязательный элемент. Строка, идентифицирующая импортируемое пространство имен XML.
Комментарии
Префиксы пространства имен XML полезны, если требуется многократно создавать XML-элементы из одного и того же пространства имен. Префикс пространства имен XML, объявленный с помощью Imports инструкции, является глобальным в том смысле, что он доступен для всего кода в файле. Его можно использовать при создании литералов XML-элементов и при доступе к свойствам осей XML. Дополнительные сведения см. в разделе литерал XML-элемента и Свойства оси XML.
Если определено глобальное пространство имен XML без префикса пространства имен (например, Imports » ), это пространство имен считается пространством имен XML по умолчанию. Пространство имен XML по умолчанию используется для любых литералов XML-элементов или свойств оси атрибутов XML, которые явно не задают пространство имен. Пространство имен по умолчанию также используется, если указанное пространство имен представляет собой пустое пространство имен (то есть xmlns=»» ). Пространство имен XML по умолчанию не применяется к атрибутам XML в XML-литералах или к свойствам оси атрибутов XML, не имеющим пространства имен.
Пространства имен XML, определенные в XML-литерале, которые называются локальными пространствами имен XML, имеют приоритет над пространствами имен XML, которые определены Imports инструкцией как глобальные. пространства имен xml, определенные Imports инструкцией, имеют приоритет над пространствами имен xml, импортированными для проекта Visual Basic. Если XML-литерал определяет пространство имен XML, это локальное пространство имен не применяется к внедренным выражениям.
Пример 1
Этот пример кода отображает следующий текст:
Пример 2
Этот пример кода отображает следующий текст:
Обратите внимание, что компилятор преобразует префикс пространства имен XML из глобального префикса в локальное определение префикса.
Пример 3
Этот пример кода отображает следующий текст:
Пространства имен в XML
World Wide Web Консорциум, 14 января 1999 года
Данный документ представляет собой перевод спецификации Namespaces in XML (W3C Recommendation) на русский язык. При этом нормативным документом считается оригинальная спецификация на английском языке, которую можно найти по адресу http://www.w3.org/TR/REC-xml-names Перевод спецификации на русский язык представлен на страницах портала «Россия-Он-Лайн»: http://www.rol.ru/news/it/helpdesk/xnamsps.htm Перевод выполнен Радиком Усмановым, Luxoft (IBS) Представленный документ может содержать ошибки перевода. |
Данная версия: http://www.w3.org/TR/1999/REC-xml-names-19990114 http://www.w3.org/TR/1999/REC-xml-names-19990114/xml-names.xml http://www.w3.org/TR/1999/REC-xml-names-19990114/Overview.html Последняя версия: http://www.w3.org/TR/REC-xml-names Предыдущая версия: http://www.w3.org/TR/1998/PR-xml-names-19981117 Редакторы: Tim Bray (Textuality) mailto:tbray@textuality.com Dave Hollander (Hewlett-Packard Company) mailto:dmh@corp.hp.com Andrew Layman (Microsoft) mailto:andrewl@microsoft.com
Статус данного документа
Данный документ был рассмотрен членами W3C, другими заинтересованными сторонами и утвержден Директором в качестве Рекомендации W3C. Данный документ является окончательным и может использоваться как нормативный материал для ссылки и цитирования в других документах. Участие W3C в продвижении представленной Рекомендации заключается в привлечении к ней внимания и способствовании ее широкому распространению. Тем самым наращиваются функциональные возможности и повышается степень универсальности Сети.
Перечень ошибок, обнаруженных в данной спецификации, представлен на странице http://www.w3.org/XML/xml-names-19990114-errata.
Об ошибках, обнаруженных в данном документе, просьба сообщать по адресу xml-names-editor@w3.org.
Резюме
Пространство имен XML обеспечивает простую методику получения названий для элементов и атрибутов в документах, использующих расширяемый язык разметки. Осуществляется это путем привязки последних к пространствам имен, идентифицируемым с помощью ссылок URI.
Приложения
Мы предвидим появление таких приложений для обработки расширенного языка разметки (XML), когда в одном XML документе (обычно называемом «словарем разметки») собраны элементы и атрибуты, определяемые и используемые во многих программных модулях. Повод для появления такой модульности: если имеется понятный словарь разметки и есть использующее его программное обеспечение, то проще использовать такую разметку еще раз, чем изобретать ее заново.
Подобные документы, содержащие несколько словарей разметки, порождают проблемы распознания и коллизии. Программные модули должны уметь распознавать тэги и атрибуты, для обработки которых они созданы, даже если имеют место «коллизии», когда выясняется, что разметка, разработанная для двух различных программных пакетов, использует одни и те же типы элементов и названия атрибутов.
Названия в пространстве имен XML могут быть представлены в виде полных имен (qualified names), содержащих единственный символ двоеточия, делящий такое имя на префикс пространства имен и локальную часть. С помощью префикса, привязанного к ссылке URI, осуществляется выбор пространства имен. Сочетание единообразно обрабатываемого URI пространства имен и собственного пространства имен документа формирует идентификатор, уникальный повсюду. Дается методика определения области видимости префикса и значения по умолчанию.
Ссылка URI может содержать символы, недопустимые для имен, поэтому саму ссылку нельзя использовать в качестве префикса пространства имен. Таким образом, префикс пространства имен служит заменителем ссылки URI. Далее описывается построенный на атрибутах синтаксис, позволяющий декларировать связь префикса пространства имен со ссылкой URI. Программное обеспечение, поддерживающее указанный сценарий использования пространства имен, должно уметь анализировать и использовать описанные декларации и префиксы.
Отметим, что многие используемые в сценариях этой спецификации нетерминальные конструкции определяются не здесь, а в спецификации XML [XML]. Если определенная здесь нетерминальная конструкция имеет то же самое имя, что было определено для нетерминала в спецификации XML, то множество строк, соответствующих сценарию здесь, является лишь подмножеством всех строк, соответствующих сценарию там.
В сценариях этого документа аббревиатура NSC расшифровывается как «Namespace Constraint» (ограничение на пространство имен), одно из правил, которому должны следовать документы, отвечающие требованиям данной спецификации.
Заметим, что все использованные в примерах названия доменов Internet (за исключением w3.org ) выбраны случайным образом и их не следует принимать за источник информации.
Пример декларации, связывающей префикс edi с пространством имен, имеющим название http://ecommerce.org/schema :
[Определение:] В XML документах, отвечающих требованиям данной спецификации, часть имен (конструкций, соответствующих нетерминальному Name ) может быть представлено в виде полных имен (qualified names), определяемых следующим образом:
Полное имя | ||||||||||||
|
Поле Prefix определяет в полном имени префикс пространства имен и должно быть связано со ссылкой URI в декларации пространства имен. [Определение:] Поле LocalPart определяет локальную часть (local part) полного имени.
Заметим, что префикс используется только для хранения названия пространства имен. При построении имен, область действия которых выходит за пределы первоначального документа, приложения должны использовать название пространства имен, а не префикс.
В XML документах, отвечающих требованиям данной спецификации, полные имена даются для следующих типов элементов:
Типы элементов | ||||||||||||||||||
|
Пример использования полного имени в качестве типа элемента:
Атрибут | |||||||
|
Пример использования полного имени в качестве названия атрибута: