В названии XML символ X представляет слово extensible (расш~ мый). Язык XML не имеет никаких предопределенных элементов; работчик сам придумывает названия элементов для каждого конк ного документа XML. Именно эта расширяемость XML обеспе ему такую популярность, но она же может стать и источником блем, например конфликтов имен. Рассмотрим такой документ
<?xml version="1.0" encoding="titf-8"?>
12345
Your Street
Your City
Your State
USA
.
В нем нет ничего необычного. Он просто описывает адрес местоп жения в США. Но что произойдет, если в него добавить следую строки:
<?xml version="1.0" encoding="utf-8"?>
Теперь документ описывает два типа адресов: почтовый адрес и сете¬вой адрес компьютера. Хотя оба этих адреса правильные (в своем кон¬тексте), однако обработка их требует различных подходов, тем более что оба элемента содержат совершенно различные наборы дочерних узлов. Процессор XML не в состоянии различить эти два эле¬мента , поэтому вы должны сами обеспечить это. Это как раз та ситуация, когда в игру вступают пространства имен.
Пространства имен состоят из двух частей: уникальный идентифика-wwpресурса пространства имен (namespaceURI) и префикс. Уникаль¬ный идентификатор ресурса идентифицирует пространство имен. Ча¬ще всего namespaceURI представляют собой URL сайтов, поскольку они у разных сайтов должны быть разными (уникальными). Префикс -это локальное имя пространства имен внутри документа XML. Назва¬нию каждого тега в пространстве имен предшествует префикс этого пространства имен. Синтаксис объявления пространства имен:
xmlns:namespace-prefix="namespaceURI"
Ключевое слово xmlns сообщает синтаксическому анализатору XML, что в данном месте находится объявление пространства имен, namespa¬ce-prefix - это локальное имя пространства имен, которое может фигу¬рировать в названиях элементов, входящих в это пространство имен, a namespaceURI - универсальный идентификатор ресурса, который пред¬ставляет данный префикс.
Пространство имен необходимо сначала объявить, а уже потом его мож¬но будет использовать в документе XML. В следующем примере корне¬вой элемент документа содержит объявления двух пространств имен:
<?xml version="1.0" encoding="utf-8"?>
Oddresses xmlns:mail="http://www.wrox.com/mail"
xmlns:comp="http://www.wrox.com/computer">
"12345
•email :street>Your Street Your City
Your State • USA
127.О.0.1 localhost
В этом подправленном документе XML объявляются два прострав имен: одно (с префиксом mail) представляет почтовые адреса, а вт (с префиксом сотр)- сетевые адреса компьютеров. Вероятно пер на что вы обратили внимание - это на то, что в названиях всех есть префиксы. Каждый элемент, связанный с определенным типом! реса, связан с определенным пространством имен, таким образом,. бой элемент, представляющий почтовый адрес, имеет префикс тогда как все элементы, описывающие сетевой адрес компьютера, ют префикс сотр.
Благодаря использованию пространств имен устраняются конфл* имен, и теперь процессор XML сможет отслеживать различия ме двумя типами адресов.
Пространства имен в XPath несколько осложняют применение дов selectSingleNode() и selectNodes(). Рассмотрим следующую, сколько модифицированную, версию файла books, xml:
<?xml version="1.0" encoding="utf-8"?>
Professional Ajax
Nicholas C. Zakas, Jeremy McPeak, Joe Fawcett
Wrox
Professional JavaScript for Web Developers Nicholas C. Zakas
Wrox
Professional C# Simon Robinson, et al
Wrox
GDI+ Programming: Creating Custom Controls Using C#Eric White
Wrox
Professional Visual Basic 6 Oatabases Charles Williams
\ Wrox
Теперь в документе используются два пространства имен: пространст¬ве ахен по умолчанию, описанное как xmlns="http://site1.com", и до-ввшнительное пространство имен pub, описанное как xmlns: pub="http:// stte2.com". Пространство имен по умолчанию не имеет префикса, та-t образом, все элементы в документе, не имеющие префикса, попа-■ в него. Обратите внимание, что элементы в докумен-ебыли заменены элементами .
[того чтобы можно было использовать выражения XPath при работе с документом XML, содержащим пространства имен, эти пространства необходимо объявить. MSXML DOM-документа предоставляет метод савсенем setPropertyO, предназначенный для изменения свойств объ¬екта. Перед использованием пространств имен, как внешних, так и по ежюлчанию, их надо записать в свойство SelectionNamespaces. Объявле¬на пространств имен, записываемые с помощью метода setPropertyO, движим выглядеть точно так же, как и в самом документе XML:
Пространства имен па и pub являются представлением пространств аввш, используемых в документе XML. Обратите внимание, что для пространства имен по умолчанию определен префикс па. Дело в том, »MSXML не распознает пространства имен по умолчанию при выбо-узлов средствами XPath, поэтому и необходимо объявление пре-\. Теперь, когда свойство SelectionNamespaces установлено долж-[ образом, вы можете отбирать узлы внутри документа:
var oRoot = oXmlDom.documentElement; ^var sXPath = "na:book/pub:name"; var cPublishers = oRoot.selectNodes(sXPath);
:Jf (cPublishers. length > 0) { .
alert(cPublishers.length + " по шаблону " + sXPath
+ " найдены элементы ";
иелражение XPath использует пространства имен, определенные в свой¬стве SelectionNamespaces, и выбирает все элементы . В дан-иен случае NodeList будет содержать пять элементов.