Проблемы пространства имен
Третий источник проблем, который обсуждается в настоящей статье, - это использование пространств имен XML.
Пространства имен были введены для управления словарями XML и предотвращения использования тэгов с одинаковыми именами. Часто два словаря могут использовать один и тот же тэг в разных контекстах. Например, в словаре сообщений могут быть тэги для темы, даты, отправителя, адресата и тела письма (см. листинг 2), а в словаре цифровых ресурсов - тэги для темы, даты, описания, камеры и номера кадра (см. листинг 3).
Листинг 2. Словарь сообщений
<envelope> <subject>Test memo</subject> <date>April 26, 2005</date> <from>jack@writeit.com</from> <to>john@xmli.com</to> <body>memo body goes here</body>
</envelope>
Листинг 3. Словарь цифровых ресурсов
<photo> <subject>Westlicht Museum of Camera and Photography, Vienna</subject> <date>April 25, 2005</date> <description>Lobby of the museum</description> <camera>Nikon D70</camera>
<frame>5643</frame> </photo>
Конфликты возникают, если цифровой ресурс посылается через платформу для обмена сообщениями, поскольку программное обеспечение не может отличить друг от друга тэги темы и даты в двух словарях. Другими словами, имя тэга не является глобальным идентификатором.
Пространства имен XML превращают локальные имена в глобальные путем добавления глобального идентификатора к имени тэга. Для того чтобы гарантировать уникальность глобальных идентификаторов, они должны представлять собой URI (Uniform Resource Identifiers - универсальные идентификаторы ресурсов) (т.е. содержать имя домена, зарегистрированного для гарантии уникальности). Соответствующий пример приведен в листинге 4.
Листинг 4. Сочетание словарей
<env:envelope xmlns:env="http://psol.com/2005/env" xmlns:ph="http://psol.com/2005/photo"> <env:subject>Latest photo</env:subject> <env:date>April 27, 2005</env:date> <env:from>jack@writeit.com</env:from> <env:to>john@xmli.com</env:to>
<env:body> <ph:photo> <ph:subject>Westlicht Museum of Camera and Photography, Vienna</ph:subject> <ph:date>April 25, 2005</ph:date> <ph:description>Lobby of the museum</ph:description>
<ph:camera>Nikon D70</ph:camera> <ph:frame>5643</ph:frame> </ph:photo></env:body> </env:envelope>
Здесь есть два момента, которые требуют дополнительных пояснений:
- URI - это идентификатор, а не адрес;
- префикс - это не идентификатор.