Здравствуйте, уважаемые посетители моего скромного блога для начинающих вебразработчиков и web мастеров ZametkiNaPolyah.ru. Сегодня я продолжу рубрику Заметки о XML и XLST. И хочу поговорить о пространстве имен в XML, что такое пространство имен и для чего оно используется, так же затрону тему конфликта имен в XML документе и как бороться с этим явлением, поговорим о том как задать пространство имен в XML документе, сразу скажу, что есть два способа задания пространства имен, первый при помощи атрибута xmlns, а второй при помощи префиксов, посмотрим различие между двумя этими способами.Конфликты в XML. Пространство имен в XML. Способы именования пространства имен в XML. Как использовать HTML теги в XML документах Поговорим о рекомендованных способах именования пространства имен в XML, их так же два. Первый заключается в использование URN, а второй в использование URL. Разберемся, какой из способов, когда и как применяется. Так же мы поговорим о том, как задать пространство имен XML атрибутам. А так же разберемся как можно использовать HTML теги в XML документах и что для этого нужно сделать.

Конфликты в XML документах. Пространство имен в XML документах

Очень важным моментом в XML является конфликт имен тэгов, ведь имена тегов мы придумываем сами, и нет гарантии, что кто-нибудь другой в своем проекте не будет использовать точно такие же имена для своих тегов, как и мы. Например, у меня есть книжный магазин и решил я записывать название книг внутрь тега <title>…</title>, а какой-нибудь Василий Иванович Пупкин использует этот тег для своих каких-то целей, к примеру, продает он аудио пластинки и  внутрь тега <title> записывает название фильмов. И все это будет хорошо работать, пока не решим мы с Пупкиным объединиться и вместе продавать книги и пластинки. Получается ситуация, в которой один и тот же XML элемент имеет одинаковое имя, но имеет разный смысл. И наступает процесс именуемый конфликт имен.

Как и в случае с кодировками проблема конфликта имен в XML решена изящно. И называется это решение пространство имен. Давайте для начала разберемся, что такое пространство имен в XML, грубо говоря, когда мы придумываем какие-то имена для XML элементов, то есть придумываете XML теги, вы как бы себя ограничиваете этим пространством и говорите – это мое пространство имен и сюда ребятки не суйтесь. Или если вернуться к моему примеру, то я придумываю тэг <title> и говорю, что этот тег относится к пространству книжный магазин или же стандарта книжный магазин, тем самым вы уже ограничили себе  область действия. В свою очередь Пупкин может сказать, я придумал элемент <title>, который принадлежит к пространству аудиомагазин. И получается следующая штука, теги называются одинаково, но имеют различный смысл, различное назначение и находятся в различных областях, никак не мешая друг другу.

Если до сих пор непонятно, то можно привести более конкретный пример – файловая система. Все наверное знают, что в одной папке не может находиться два файла с одинаковым названием и расширением. Но можно ведь создать две папки, в одну папку поместить файл document.xml и в другую папку поместить файл document.xml и эти два файла будут прекрасно существовать, и работать, имея различное содержание. Эти два файла для операционной системы будут разные так как она учитывает не только имя файла, но и путь к этому файлу, то есть для операционной системы имя файла состоит из непосредственного имени файл плюс полный путь к этому файлу. Вот как раз из-за этого пути к файлу имена становятся разными и не мешают друг другу.

Пространство имен в XML это примерно то же самое, что и файловая система, грубо говоря имя тега в XML состоит из двух частей, первая часть – это непосредственно имя самого тега(локальное имя, то что мы видим и пишем в редакторе) и вторая часть – пространство имен данного тега(как папка в файловой системе), только если файловая система это локальная штука, то есть работает в пределах одного компьютера, то пространство имен  в XML распространяется на всю информационную систему мира, то есть для всех машин в мире. Понятно, что пространство имен должно быть уникальным, так же как и полный путь к папке. По своей сути пространство имен это строка текста, но эта строка должна быть уникальной.

Рекомендации w3.org при именовании пространства имен

Да, w3.org попыталась как-то ограничить процесс придумывания имен для пространства имен и рекомендует нам консорциум два способа именования пространства имен. Обратите внимание, что это не стандарт, а просто рекомендация. Если вы решили дать своему пространству имен какое-то имя, ну например moe-prostranstvo-imen, то начинать это имя рекомендуется с последовательности urn:, а затем уже имя пространства.

[php]urn: moe-prostranstvo-imen [/php]

Все вместе написанное и есть пространство имен, но такой подход используется редко, в основном только для общеизвестных вещей, например пространство имен от Microsoft или Apple. Для всех остальных случаев рекомендуется использовать второй подход. И опять-таки очень грамотное  решение от w3.org, как известно в интернете нет двух сайтов с одинаковым названием, поэтому они рекомендуют использовать в качестве имени пространства имен имя своего сайта. Но тут есть один интересный момент, когда при именование пространства вы используете второй способ, то перед адресом вашего сайта вам нет надобности писать URL.

[php] //zametkinapolyah.ru [/php]

Это пример, как бы я мог именовать своё пространство имен. Вообще-то, что в первом, что во втором случае используется URI – это универсальный идентификатор, который может быть URL – универсальным указателем на ресурс или URN – универсальным именем ресурса. При именование первым способом вам желательно указать, что это имя ресурса, то есть написать urn:, а вот с url есть тонкий момент. Все дело в смысле самого URL – это не что иное, как указатель на ресурс или его адрес во всемирной паутине, а если адрес указывает на не существующий файл, то мы получаем битую ссылку, а это уже будет неправильно. Но на самом деле в XML URL это не ссылка, понятно, что когда парсер анализирует XML файл, он никуда не лезет, для него это строка текста похожая на вебовский URL. Из всего выше сказанного понятно, что пространство имен это не обязательно ссылка на реальную страницу, то есть я могу придумать название для пространства имен например такое:

[php] //zametkinapolyah.ru/zametki-o-tom-kak-gotovit-borsh [/php]

Такой страницы на моем сайте нет, но я имею полное право именовать таким способом своё пространство имен.

Два способа обозначения пространства имен или как записать пространство имен в XML документе

Так же как и с именованием пространства имен в XML есть два способа записи пространства имен в XML документ. Как мы знаем, в XML нет ни одного тега, нет ни одного атрибута имеющего смысл, но в XML есть один атрибут, который нельзя использовать для своих нужд и называется он xmlns – xml name space или по-русски пространство имен XML. То есть, когда вы пишите какой-нибудь тег, вы можете задать ему атрибут, значение которого будет указывать, к какому пространству имен будет принадлежать пространство имен.

[php]</p>
<story>
<book>
<author >М. Дрюон</author>
<title xmlns=”http://book-story.com”>Негоже лилиям прясть</title>
</book>
<audio>
<artist>А. Укупник</artist>
<title xmlns=”http://audio-story.com”>Альбом Укупника</title>
</audio>
</story>
[/php]

В атрибуте xmlns я указал имя пространства имен, а читается вся эта запись вот так: элемент <title> из пространства имен http://book-story.com. Таким образом, вы указали, что данный элемент принадлежит пространству имен http://book-story.com. При таком способе все вложенные элементы, вложенные внутрь элемента с атрибутом xmlns, так же привязываются к указанному пространству имен, если не указано иное. И понятно, что если нам необходимо привязать весь файл к какому-либо пространству имен, то атрибут xmlns следует написать внутри корневого тега XML-документа, в примере это тег <story>. Ясно, что документ может быть смешанным, то есть каждый тег может принадлежать разному пространству имен, никто этого не запрещает. В этом вся фишка пространств имен.

Как использовать HTML теги в XML документе

Допустим, у нас есть некий XML документ:

[php]</p>
<?xml version="1.0" encoding="UTF-8"?>
<data xmlns="//zametkinapolyah.ru/zametki-o-xml-i-xlst">
<document>
<date>4-06-2012</date>
<instruction>

</instruction>
</document>
</data>
[/php]

И перед нами поставлена задача занести в этот документ, ну скажем правила противопожарной безопасности(ППБ), со ссылками на указы министра МЧС, на различные законы, приказы и рекомендации, важные места правил должны быть выделены жирным, а особо важные подчеркнутым, так же документ должен содержать заголовки, вообщем текст должен быть отформатирован. И как это сделать в XML? Но ведь в XML нет тегов форматирования, значит их нужно придумать или где-то взять. А давайте вспомним, где есть теги, которые позволяют нам отформатировать документ, конечно же, они есть в HTML. Поэтому ничего не надо придумывать, все уже придумано.

А теперь давайте переделаем немного предыдущий пример:

[php]
<?xml version="1.0" encoding="UTF-8"?>
<data xmlns="//zametkinapolyah.ru/zametki-o-xml-i-xlst">
<document>
<date>4-06-2012</date>
<instruction>
<div id="container">

</div>
</instruction>
</document>
</data>
[/php]

В XML документ я добавил элемент DIV, но этот DIV из пространства HTML, соответственно этому блоку нужно указать атрибут xmlns и передать в качестве значение пространство имен HTML. Но в HTML нет пространства имен, но если вы зайдете на сайт консорциума w3.org и посмотрите исходный код страницы, то обнаружите такое пространство имен — xmlns=http://www.w3.org/1999/xhtml. Это пространство имен языка xhtml. XHTML отличается от HTML тем, что HTML по причине своего синтаксиса не совместим с XML, поэтому парни из консорциума взяли всю семантику HTML и описали ее в XML и получился XHTML, в котором вся семантика от HTML, а синтаксис от XML. И чтобы пользоваться в своих документах XHTML тегами, нужно указывать пространство имен XHTML. А еще к XHTML применимы все технологии XML. А теперь окончательный пример того, как пользоваться HTML тегами в XML:

[php]
<?xml version="1.0" encoding="UTF-8"?>
<data xmlns="//zametkinapolyah.ru/zametki-o-xml-i-xlst"></p>
<document>
<date>4-06-2012</date>
<instruction>
<div id="container" xmlns="http://www.w3.org/1999/xhtml">

</div>
</instruction>
</document>
</data>
[/php]

Все, теперь внутри элемента div можно писать любые теги XHTML, создавать списки, ссылки, параграфы и так далее. Правда это не означает, что браузер будет отображать XML документ как HTML документ, он не будет отображать его как HTML, пока мы этого не захотим, но об этом позже.

Второй способ добавление XML элемента к пространству имен

Бывают ситуации, когда каждый тег XML документа принадлежит разному пространству имен и длинные строчки атрибута xmlns писать не очень удобно. Поэтому придуман второй способ назначения пространства имен, суть его заключается в том, что для присвоения тега какому-либо пространству имен используется префикс. Суть его очень проста, после того как вы написали атрибут xmlns нужно поставить двоеточие xmlns:, а после двоеточия придумать какое-нибудь имя или псевдоним xmlns:ht=”http://www.w3.org/1999/xhtml” данная конструкция означает, что http://www.w3.org/1999/xhtml имеет псевдоним ht, а затем когда вы захотите привязать какой-либо тег к пространству имен вам достаточно будет указать псевдоним и поставить двоеточие <ht:div>…</div>, тем самым мы как бы говорим, элемент div из пространства ht. Например:

[php]</p>
<?xml version="1.0" encoding="UTF-8"?>
<data xmlns="//zametkinapolyah.ru/zametki-o-xml-i-xlst">
<document>
<date>4-06-2012</date>
<instruction>
<div id="container" xmlns:ht="http://www.w3.org/1999/xhtml">
</div>
<ht:p></p>
</instruction>
</document>
</data>
[/php]

Между двумя способами есть очень важное отличие, когда идет привязка напрямую, то есть для указания пространства имен вы используете атрибут xmlns, то к данному пространству привяжутся все элементы находящиеся внутри этого элемента. А если вы используете префикс, то нужно явно указывать для каждого тега пространство имен, к которому этот тег принадлежит.

Поэтому можно сделать следующую штуку, в в корневом XML документе указать все пространства имен и их префиксы, а затем использовать их по всему XML документу:

[php]
<?xml version="1.0" encoding="UTF-8"?>
<data xmlns:znp=//zametkinapolyah.ru/zametki-o-xml-i-xlst
xmlns:html="http://www.w3.org/1999/xhtml">
<znp:document>
<znp:date>4-06-2012</date>
<znp:instruction>
<html:div id="container">
</div>
<html:p></p>
</instruction>
</document>
</data>
[/php]

Но в этом случае нужно будет явно указывать каждому элементу его пространство имен.

Так же как и XML элементам можно задавать пространство имен, так же его можно задавать и атрибутам, достаточно перед атрибутом указать префикс пространства имен, к которому вы хотите привязать данный атрибут. По умолчанию атрибут принадлежит тому пространству имен, к которому принадлежит элемент, так как атрибут это неразрывная часть элемента. Но это используется только в том случае, когда вы хотите задать элементу дополнительный атрибут из другого пространства имен.

На этом всё, спасибо за внимание, надеюсь, что был хоть чем-то полезен и до скорых встреч на страницах блога для начинающих вебразработчиков и вебмастеров ZametkiNaPolyah.ru 

Возможно, эти записи вам покажутся интересными


Выберете удобный для себя способ, чтобы оставить комментарий

This article has 1 comment

  1. Диман Reply

    Слишком большой шрифт, можно помельче!

Leave a Comment

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

Loading Disqus Comments ...