Пространства имен в документах XML
Пусть задан следующий XML документ:
<table>
<title>Фрукты</title>
<column>
<title>Яблоки</title>
<price title="гривня">23.50</price>
</column>
<column>
<title>Груши</title>
<price title="гривня">18.70</price>
</column>
</table>
Данный документ описывает таблицу под названием «Фрукты», состоящую из двух колонок с именами «Яблоки» и «Груши». Каждый контейнер «column» содержит элемент «Цена» («price»), имеющий атрибут «title».
Отметим, что идентификатор «title» используется в трех различных смыслах: в качестве имени таблицы, в качестве названия колонки таблицы и в качестве названия денежной единицы, в которой указана цена товара. Программа-парсер, обрабатывающая XML документ, не сможет понять, в каком контексте используется тот или иной идентификатор «title».
Предположим, в данный XML документ добавлен следующий фрагмент, описывающий компьютерный стол:
<table>
<title>Стол компьютерный</title>
<price title="гривня">1500</price>
</table>
Теперь для программы неразличимым будет не только имя «title», но и имя «table», обозначающее в первом случае таблицу, во втором – стол.
Технология XML предоставляет разработчикам при создании XML документов возможность использовать элементы и атрибуты с любыми именами (естественно при соблюдении определенных синтаксических правил). Поэтому часто возникает проблема неоднозначности имен. В русском, английском и других языках достаточно широко встречаются слова омонимы, т.е. слова, которые пишутся одинаково, но имеют разный смысл.
Возьмем известную скороговорку: «Запер замок на замок, чтобы замок не замок». Здесь слово замок употребляется четыре раза, в трех совершенно разных смыслах: 1) здание; 2) устройство, обеспечивающее защиту входа; 3) результат действия попадания воды.
Еще один пример, но уже из английского языка: слово down. Оно может обозначать существительное: а) возвышенность; б) центральную, деловую часть города, а также наречие вниз, которое несет противоположенную смысловую нагрузку варианту а). Также слово down может переводиться и как существительное пух (например, тополиный пух).
В приведенных выше примерах одинаковые по написанию слова имеют разный смысл, и определить контекст их использования не представляет особого труда. Однако достаточно часто могут встретиться более тонкие ситуации, когда слово имеет одно базовое понятие, но в рамках этого понятия могут возникнуть нюансы, требующие уточнения контекста.
Например, возьмем слово сеть.Независимо от того, является сеть инструментом для ловли рыбы, множеством торговых представителей фирмы, или объединенных каналами компьютеров, понятие самого слова сеть в узком смысле остается одинаковым: это связанные в определенную структуру узлы. Тем не менее, если мы разрабатываем XML документ, описывающий сеть дилеров, распространяющих оборудование и программы для компьютерных сетей, то необходимо четко задать соответствующие контексты. Возможно, что контекст, описывающий оборудование и программы для сетей, с целью устранения конфликтов в понятиях и терминах, также следует рассматривать не как единый, а разделить на два контекста: отдельно для сетевого оборудования, и отдельно для сетевых программ.
В естественных языках контекст слова или понятия формируется не абстрактно, а зависит от предметной области, к которой он принадлежит. Например, если мы берем предметную область «локальные сети», то под словом сеть будет пониматься компьютерная сеть, охватывающая небольшую территорию, обладающая определенной топологией, скоростью передачи. Человек, анализируя текст, интуитивно понимает, в каком контексте используется слово и скрывающееся за ним понятие. Но для компьютерной программы, которая будет обрабатывать XML документ, контекст, определяющий понятия, которые используются в XML документе, должен быть задан четко.
В XML технологии множество понятий (элементов, атрибутов), принадлежащих определенной предметной области, характеризуется понятием «пространство имен» (NameSpace). Пространство имен – это набор имен, в котором все имена уникальны. Согласно спецификации W3C (http://www.w3.org/TR/1999/REC-xml-names-19990114), «пространство имен XML – это идентифицируемая с помощью ссылки URI [RFC2396] коллекция имен, используемых в XML документах для обозначения типов элементов и именования атрибутов». Как видно из данного определения, пространство имен идентифицируется не просто уникальным набором символов, а именно ссылкой URI.
Предположим, нам необходимо задать пространство имен для XML документа, описывающего предметную область «программное обеспечение локальных сетей». Мы можем задать URI: «http://www.network.com/lan/soft/». С точки зрения спецификации пространства имен это совсем не означает, что по указанному адресу находится какой-то документ, описывающий необходимые элементы и атрибуты нашего XML документа. Приведенный адрес – это просто уникальный идентификатор, который в XML документе будет однозначно квалифицировать имена, относящиеся к предметной области «программное обеспечение локальных сетей».
В принципе, задать уникальный идентификатор можно было бы и каким-либо другим способом, например, методом последовательных уточнений, используя в качестве разделителя точку: «network.lan.soft». Однако в качестве идентификаторов пространств имен следует использовать URI, поскольку именно URI определен в спецификации пространства имен для формирования уникального идентификатора. Ссылка URI – это идентификатор, характеризующий пространство имен, и ничего более. Он ни на что не указывает, по его адресу ничего не располагается. А если это, к тому же, URL своего ресурса, то вряд ли кто-то будет использовать его в качестве идентификатора для своей схемы. URI определяется как составная строка символов для определения абстрактного или физического ресурса. В большинстве ситуаций ссылки URI используются для определения физических ресурсов (Web-страниц, файлов для загрузки и т.д.), но в случае с пространствами имен XML ссылки URI определяют абстрактные ресурсы, а именно, пространства имен.
Согласно URI-спецификации, существует две основные формы URI: Унифицированные указатели информационного ресурса (Uniform Resource Locators, URL) и Унифицированные имена информационного ресурса (Uniform Resource Names, URN). Любой тип URI может использоваться как идентификатор пространства имен. Ниже приведен пример двух URL, которые могут использоваться в качестве идентификаторов пространства имен: