Пространства имен используются для разделения или идентификации данных.
В XML они используются для связи одного или более узлов с определенным
URI (унифицированный идентификатор ресурса). Элементы с пространством
имен могут иметь ту же метку имени, как и другие метки, но по-прежнему
не отделяются от них из-за своей связи с URI.
Вы часто будете наблюдать пространства имен, используемые в RSS лентах. Например, Apple iTunes подкаст фид, использует пространство имен itunes для отделения специфических меток iTunes от других обычных меток RSS 2.0. Пространства
имен могут определяться в XML файле двумя способами. Один способ – это
определить атрибут, названный xmlns, внутри узла элемента со значением
URI. Этот узел и все его потомки будут принадлежать пространству имен,
установленному этим URI. Значения URI обычно являются адресами
веб-сайтов. Они не обязательно должны быть верными адресами, но так как
только одно тело может обладать любым одним доменом, они делают хорошее
дело, позволяя убедиться, что люди не будут использовать один и тот же
URI для разных целей. Это известно в качестве установки пространства
имен по умолчанию.
В приведенном выше примере и родитель, и потомок находятся в пространстве имен, определенном URI example.com (http://www.example.com/uri/). Пространство
имен URI так же может быть связано с префиксом в XML. При определении с
префиксом, только узлы, использующие этот префикс, будут
рассматриваться как часть пространства имен. И узлы, и атрибуты
элемента могут использовать префикс. Чтобы определить префикс, нужно
создать узел xmlns в родительском элементе с именем префикса в качестве
суффикса атрибута xmlns.
<xml xmlns:ns="http://www.example.com/uri/"> <parent> <ns:child /> </parent> </xml> В данном примере только элемент-потомок находится в пространстве имен, так как только этот узел использует префикс ns.
Посмотрев
на пример XML документа iTunes podcast, вы можете увидеть, как элементы
с префиксом itunes (для пространств имен itunes) смешиваются с другими
элементами, находящимися вне пространства имен, показывая, что они
являются специфическими для iTunes.
<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0"> <channel>
<title>All About Everything</title> <link>http://www.example.com/podcasts/everything/index.html</link> <language>en-us</language> <copyright>℗ & © 2005 John Doe & Family</copyright> <itunes:subtitle>A show about everything</itunes:subtitle> <itunes:author>John Doe</itunes:author> <itunes:summary>All
About Everything is a show about everything. Each week we dive into any
subject known to man and talk about it as much as we can. Look for our
Podcast in the iTunes Music Store</itunes:summary> <description>All
About Everything is a show about everything. Each week we dive into any
subject known to man and talk about it as much as we can. Look for our
Podcast in the iTunes Music Store</description> <itunes:owner> <itunes:name>John Doe</itunes:name> <itunes:email>
john.doe@example.comЭтот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
</itunes:email> </itunes:owner> <itunes:image href="http://example.com/podcasts/everything/AllAboutEverything.jpg" /> <itunes:category text="Technology"> <itunes:category text="Gadgets"/> </itunes:category> <itunes:category text="TV & Film"/>
<item> <title>Shake Shake Shake Your Spices</title> <itunes:author>John Doe</itunes:author> <itunes:subtitle>A short primer on table spices</itunes:subtitle>
<itunes:summary>This week we talk about salt and pepper shakers,
comparing and contrasting pour rates, construction materials, and
overall aesthetics. Come and join the party!</itunes:summary> <enclosure url="http://example.com/podcasts/everything/AllAboutEverythingEpisode3.m4a" length="8727310" type="audio/x-m4a" /> <guid>http://example.com/podcasts/archive/aae20050615.m4a</guid> <pubDate>Wed, 15 Jun 2005 19:00:00 GMT</pubDate> <itunes:duration>7:04</itunes:duration> <itunes:keywords>salt, pepper, shaker, exciting</itunes:keywords> </item>
</channel> </rss> Любые
элементы внутри спецификации RSS, использующие те же метки, что и
iTunes, не будут конфликтовать, так как используют префикс itunes и его
связь с уникальным URI iTunes.
При
работе в XML с пространством имен вам понадобиться прописать в коде
использование пространств имен, чтобы получить доступ к узлам внутри
XML файла, который использует их. Хотя элементы с пространствами имен
могут иметь одно и то же локальное имя, или метку имени, не включающую
префикс пространства имен (если оно существует), их пространство имен
помогает определить их настоящее имя (URI + локальное имя). Поэтому
элемент с пространством имен, на которое существует ссылка по имени,
нуждается в пространстве имен. Во флеш сослаться на узел с
пространством имен можно по его имени и базовому имени в сочетании с
оператором описания имени (::).
Пространства имен в ActionScript 3 обрабатываются через новый класс Namespace ( top-level Namespace).
Этот класс состоит из двух свойств - uri и prefix, которые относятся к
URI пространства имен и префиксу пространства имен, если оно имеет его.
URI – действительно более важная часть экземпляра Namespace, так как он
определяет полное имя узла. Префикс является неким подобием ярлыка для
связи URI с узлом. // Create a new Namespace instance var myNamespace:NameSpace = new Namespace("http://www.example.com/uri"); После
определения пространства имен, его можно использовать для ссылки на XML
узлы внутри назначенного URI пространства имен посредством
использования оператора описания имен. Оператор описания имен в
ActionScript во многом работает схоже с префиксом пространства имен
внутри текущего XML файла. В XML префикс идет впереди имени узла,
отделяя себя от имени двоеточием (:). В ActionScript сейчас
используется просто два двоеточия (::). // XML with xpl namespace var xml:XML = <xml xmlns:xpl="http://www.example.com/uri/"> <text>Hello World</text> <xpl:text>Hello Namespace</xpl:text> </xml>; // Make a namespace instance based // on the xpl namespace's URI var xplNs:Namespace = new Namespace("http://www.example.com/uri/");
// Accessing the text element trace(xml.text); // traces "Hello World"
// Use the name qualifier operator to // reference the text tag using the namespace // and the element's base name trace(xml.xplNs::text); // traces "Hello Namespace" Здесь
вы можете видеть, как пространство имен разделяет текст внутри двух
элементов text. Экземпляр пространства имен xplNs используется для
доступа к текстовому элементу в пространстве имен с помощью описателя
имени, чтобы полностью описать имя этого элемента.
Если
вы хотите получить оба элемента text, или все элементы внутри узла с
локальным именем text, вы можете использовать фильтр для проверки
локального имени этих элементов. Вы можете получить доступ к локальному
имени узла XML через экземпляр QName (top-level QName),
возвращаемый методом XML name(). Экземпляры QName описывают полное имя
узла, включая локальное имя (свойство localName) и URI (свойство uri).
Чтобы фильтр работал для всех потомков узла XML, потребуется получить
доступ к потомкам узла с помощью метода children().
// XML with xpl namespace var xml:XML = <xml xmlns:xpl="http://www.example.com/uri/"> <text>Hello World</text> <xpl:text>Hello Namespace</xpl:text> </xml>;
// Get all elements with local name of text trace(xml.children().(name().localName == "text")); /* output <text xmlns:xpl="http://www.example.com/uri/">Hello World</text> <xpl:text xmlns:xpl="http://www.example.com/uri/">Hello Namespace</xpl:text> */ Обратите
внимание, что определение пространства имен сохраняется через
результаты с включением атрибута xmlns в текстовые узлы. Это позволяет
пространствам имен оставаться валидными даже при работе с частями
оригинального XML файла в ActionScript.
Иногда
может случаться такое, что у вас не будет возможности выяснить
идентификаторы URI пространства имен, используемые в XML, с которым вам
предстоит работать. Без идентификаторов URI у вас может возникнуть
проблема с доступом к узлам, потому что вы не сможете попасть в них
через их описанные имена (хотя вы по-прежнему можете легко получить к
ним доступ через индекс с помощью списка children() родительского узла,
и т. д.). Если вы не знаете, какие пространства имен используются
внутри XML файла, вы можете извлечь их, используя методы namespace() и
namespaceDeclarations().
XML метод
namespace() возвращает единственный экземпляр Namespace, который
представляет пространство имен этого XML узла. Метод
namespaceDeclarations() похож, но в отличие от предыдущего
предоставляет список всех пространств имен, определенных внутри
элемента XML – пространство имен по умолчанию (если такое существует) и
все пространства имен с их определенным префиксом. Если узел элемента
не имеет никаких xmlns атрибутов, определенных для него, метод
namespaceDeclarations() возвратит пустой массив. В то время как метод
namespace() возвратит значение унаследованного пространства имен по
умолчанию, если оно было определено в родительском узле, метод
namespaceDeclarations() возвратит только определения, установленные
внутри элемента, из которого оно используется.
Следующий
XML файл является таблицей стилей XML (XSL), используемой для
преобразования формата XML из одного формата в другой. Он имеет два
пространства имен, одно для XSL файла, а другое для генерируемого
(X)HTML файла.
Обратите
внимание, что в этом XSL файле пространство имен по умолчанию является
единственным, использующим xhtml URI. Это означает, что по умолчанию
все XML элементы рассматриваются в качестве XHTML. Элементы, не
являющиеся таковыми, получают префикс xsl, позволяющий идентифицировать
их как часть XSL пространства имен, включая корневой xsl узел, в
котором было определено пространство имен xsl. Чтобы пробраться к html
элементу были использованы оба пространства имен в пути E4X для ссылки
на него.
Приведенный выше пример
показывает также, каким образом для доступа к элементу value-of
использовались оператор доступа к потомку (..) и обозначение доступа к
массиву ([]). Обратите внимание, что скобки, использованные для ссылки
на value-of идут после оператора определения имени. Пространство имен,
использованное для определения имени вашего элемента, не может быть
использовано внутри скобок. Оно по-прежнему отделяется от локального
имени – локальное имя (в качестве строки) является единственной частью
внутри скобок. Тем не менее, этот формат не будет работать в связке с
методом elements() или descendants(). В этих случаях вам потребуется
попасть в экземпляр QName, чтобы добраться до этих методов,
определяющих как локальное имя, так и URI пространства имен. Для
доступа к элементу через использование descendants вместо оператора
доступа к потомку, вы будете использовать следующее. // descendants method with namespace xsl.xslNs::template.xhtmlNs::html.descendants(new QName(xslNs.uri, "value-of")) По
мере того, как вы начинаете ссылаться на узлы XML в такой форме с
наличием пространства имен, вы можете обнаружить, что ссылки могут
стать чересчур длинными, особенно если вам приходится добавлять префикс
определения пространства имен к каждому узлу, когда, например, ваш XML
документ использует даже одно пространство имен по умолчанию. Чтобы
немного облегчить этот процесс, в ActionScript имеется функция
назначения xml пространства имен по умолчанию с использованием
директивы default xml namespace.
Директива
default xml namespace выступает как некоторый вид переменной, которую
вы устанавливаете для того, чтобы назначить тип автоматического
пространства имен для XML ссылок. Это позволит вам использовать ссылки
E4X на XML файл, который использует единственное пространство имен без
необходимости задания префиксов каждому узлу с соответствующим
определителем.
// Get the title trace(xsl.xslNs::template.xhtmlNs::html.xhtmlNs::head.xhtmlNs::title); // traces Expense Report Summary
// set xhtmlNs as the default namespace default xml namespace = xhtmlNs;
// Get the title now with default namespace trace(xsl.xslNs::template.html.head.title); // traces Expense Report Summary
До
сих пор примеры касались только узлов элемента внутри пространств имен.
Не забывайте, что атрибуты тоже могут быть привязаны к пространству
имен. То, что атрибут находится внутри элемента, определенного в
пространстве имен, не означает, что атрибут тоже находится в этом
пространстве имен (разве только часть пространства имен по умолчанию).
/ / XML with xpl namespace var xml:XML = <xml xmlns:xpl="http://www.example.com/uri/"> <xpl:text value="Hello World" xpl:value="Hello Namespace" /> </xml>;
// Define namespace with xpl URI var xplNs:Namespace = new Namespace("http://www.example.com/uri/");
// Get value of text attribute // with and without namespace trace(xml.xplNs::text.@value); // traces Hello World trace(xml.xplNs::text.@xplNs::value); // traces Hello Namespace Вы
можете заметить, что даже хотя оба атрибута являются частью узла text в
пространстве имен xpl, по существу они не являются частью этого
пространства имен. Для атрибута узла, чтобы поместить его в
пространство имен, по-прежнему требуется префикс (до тех пор, пока не
определено пространство имен по умолчанию и пока этот атрибут не
подпадет под иерархию этого определения).
|