Март 2011
Руководство по actionscript. часть 3, стр. 063
Использование сущностей XML для специальных символов
В расширении Е4Х реализованы особая интерпретация и правила для определенных символов пунктуации, когда они используются в литерале XML или в выражении присваивания значения XML-элементу. В табл. 18.2 показано, как включать эти символы в документ XML с помощью языка ActionScript. В левом столбце таблицы перечислены символы, а в остальных столбцах показан код, необходимый для включения этих символов в четырех различных контекстах. Для сравнения следующий код демонстрирует пример каждого из четырех типов контекста (контекст представлен текстом некийТекст).
II Текст литерала атрибута
var xml:XML =
II Текст, присваиваемый атрибуту
xml.@другойНекийАтрибут = «некийТекст»
II Текстовый узел в литерале элемента
var xml:XML = ^екм7екс7″
// Текстовый узел, присваиваемый элементу xml. другойНекийЭлемент = «некийТекст»;
Таблица 18.2. Присваивание специальных символов пунктуации
Символ Текст литерала атрибута Текст, присваиваемый атрибуту Текстовый узел в литерале элемента Текстовый узел, присваиваемый элементу
\ \\ \\ \\
& & & & &
II " \» или " V
•** 1
< < < < <
> > > > >
Новая строка (\п) Не поддерживается* Не поддерживается* Не поддерживает — \п
{ { { х7В {
} } } } }
В данных контекстах последовательность новой строки \п автоматически преобразуется в сущность хА;.
Руководство по actionscript. часть 3, стр. 064
Чтобы включить символ ‘ в значение атрибута, отделенного символамииспользуйте управляющую последовательность '.
Допускается применять последовательность \п, если значение элемента является вычисляемым. Например,
var val:Stri ng = «Newlines \n are \n okay \n here!»: var paragraph:XML =
{val}
:
В отличие от строк, в литерале XML символ обратного слэша (\) никогда не интерпретируется как начало управляющей последовательности.
Стоит отметить, что, хотя символы > и & могут быть использованы в любом литерале XML, когда среда Flash встречает их в текстовом узле при парсин-ге XML-документа, она автоматически преобразует эти символы в сущности > и &атр; соответственно. Подобным образом, когда среда выполнения встречает символ & в значении атрибута при парсинге документа XML, она автоматически преобразует этот символ в сущность &атр;. Однако при использовании в контексте строки эти сущности будут преобразованы обратно в исходные символы. Чтобы увидеть текстовый узел без преобразования его сущностей, используйте метод экземпляра toXMLString ( ) класса XML. Это демонстрирует следующий код:
var р:ХМ1_ = &>: trace(p. toString( )): // Выводит: &> trace(p. toXMLString( )): // Выводит:
&>
Наконец, обратите внимание, что, хотя символ 1 может использоваться для отделения значения атрибута в литерале XML, в процессе парсинга он преобразуется в символ «. Это демонстрирует следующий код:
var p:XML = :
trace(p. toXMLString( )): // Выводит:
Присваивание значений объекту XMLList
Как уже говорилось в подразд. «Изменение содержимого элемсч 1та», не существует разницы между присваиванием значения объекту XMLList, содержащему один-единственный экземпляр класса XML, и присваиванием значения непосредственно этому экземпляру класса XML. Тем не менее присваивание значения объекту XMLList, содержащему более одного экземпляра класса XML, может иметь множество различных результатов. В зависимости от типа присваиваемого значения и типа экземпляров класса XML, находящихся в списке, список может быть пзмеч кч i или даже полностью заменен.
Единственный типичный сценарий использования операции присваивания значения экземпляру класса XMLList — замена ребенка элемента-родителя новым XML-элементом или списком элементов. Например, следующий код заменяет два ребенка элемента одним элементом :
var doc:XML =
Errors are your friends
Backup often
:
doc* =
Practice coding everyday
; // Выдает:
Practice coding everyday
Присваивание значения объекту XMLList является редко используемой операцией, поэтому ее тщательное рассмотрение выходит за рамки этой книги. Читателям, интересующимся гротескными ситуациями в программировании, которой, например, является попытка присвоить список инструкций обработки списку атрибутов, предоставляется возможность самостоятельно познакомиться с ними.
Руководство по actionscript. часть 3, стр. 065
Загрузка XML-данных
Для наглядности в большинстве примеров этой главы ХМL-данные были записаны в виде литералов. Однако в реальных приложениях они зачастую загружаются из внешнего источника.
Для загрузки ХМL-данных из внешнего источника в экземпляр класса XML используйте такую последовательность действий.
1. Создайте объект URLRequest, описав местоположение внешних данных XML (это может быть либо файл, либо серверный сценарий, возвращающий данные в формате XML).
2. Создайте объект URLLoader и используйте его метод load ( ) для загрузки данных XML.
3. Подождите, пока загрузятся данные XML.
4. Передайте загруженные данные XML в конструктор нового экземпляра класса XML.
Хотя подробное рассмотрение классов URLRequest и URLLoader выходит за рамки этой главы, в листинге 18.13 представлен код, необходимый для загрузки XML-данных в экземпляр класса XML. Используемый в примере класс XMLLoader расширяет класс Sprite, чтобы его можно было откомпилировать в качестве основного класса приложения для тестирования. Информацию о классах URLRequest и URLLoader можно найти в справочнике по языку ActionScript корпорации Adobe. Информацию об обработке событий можно получить в гл. 12.
Листинг 18.13. Загрузка данных XML из внешнего источника
package { import flash. display.*; import flash. events.*; import flash. net.*;
// Демонстрирует код, необходимый для загрузки XML-данных
// из внешнего источника
public class XMLLoader extends Sprite {
// Переменная, которой будут присвоены загруженные XML-данные
private var novel:XML;
// Объект, используемый для загрузки XML-данных private var urlLoader:URLLoader;
// Конструктор
public function XMLLoader ( ) { // Указываем местоположение внешнего источника XML-данных var urlRequest:URLRequest = new URLRequest(«novel. xml»); // Создаем объект, который умеет загружать внешние текстовые данные urlLoader = new URLLoader( );
// Регистрируем обработчик, чтобы получить событие об окончании // загрузки XML-данных
urlLoader. addEventLi stener(Event. COMPLETE, completeLi stener); // Загружаем XML-данные urlLoader.1oad(ur1 Request);
}
// Метод, вызываемый автоматически по окончании загрузки XML-данных
private function completeListener(e:Event):void { // Строка, содержащая загруженные XML-данные, присваивается переменной // data объекта URLLoader (то есть urlLoader. data). Чтобы создать // новый экземпляр класса XML из этой загруженной строки, мы передаем // ее в конструктор класса XML novel = new XML(urlLoader. data);
trace(novel. toXMLString( )); // Отображаем загруженные XML-данные,
// преобразованные в объект XML
Обратите внимание, что все операции загрузки данных в языке ActionScript, включая операцию, представленную в листинге 18.13, попадают под действие ограничений безопасности приложения Flash Player. Полную информацию об ограничениях безопасности можно найти в гл. 19.
Руководство по actionscript. часть 3, стр. 067
Для обращения к уточненным пространствам имен элементам и атрибутам из листинга 18.14 мы должны сначала получить ссылку на используемые пространства имен. Чтобы получить ссылку на пространство http: / /www. example. com/ furniture, мы вызываем метод экземпляра namespace ( ) класса XML над корневым узлом документа, передавая в качестве аргумента префикс «shop». В результате метод namespace ( ) возвращает объект Namespace, представляющий пространство имен http://www. example. com/furniture. Мы присваиваем этот объект переменной shopNS для дальнейшего использования, var shopNS:Namespace = catalog. namespaceCshop»);
В качестве альтернативы, если известен идентификатор URI пространства имен, можно создать ссылку на объект Namespace, используя конструктор одноименного класса:
var shopNS:Namespace = new Namespace(«http://www. example. com/furniture»):
Чтобы получить ссылку на пространство имен, используемое по умолчанию, мы вызываем метод namespace ( ) над корневым узлом документа, не передавая префикс пространства имен:
var htmlNS:Namespace = catalog. namespace( ):
В качестве альтернативы, если известен идентификатор URI пространства имен, мы можем создать ссылку на объект Namespace, используемый по умолчанию, с помощью конструктора одноименного класса:
var htmlNS:Namespace = new Namespace(«http://www. w3.org/1999/xhtml»);
Для обращения к пространствам имен документа могут использоваться и методы inScopeNamespaces ( ) и namespaceDeclarations ( ). Дополнительную информацию можно найти в справочнике по языку ActionScript корпорации Adobe.
В расширении Е4Х атрибуты пространств имен XML не представляются в виде атрибутов (то есть к ним нельзя обратиться с помощью метода attributesC) или выражения некийЭлемент.®*). Вместо этого для обращения к объявлениям пространств имен элемента применяется метод экземпляра namespaceDeclarations() класса XML.
Теперь, когда у нас есть ссылка на объект Namespace, мы можем обращаться к уточненным пространством имен элементам и атрибутам, используя уточненные имена в следующем общем формате:
пространствоИмен::локальноеИмяЭлемента пространствоИмен::$локальноеИмяАтрибута
Например, вот так записывается уточненное имя элемента в коде на языке ActionScript:
shopNS::price
Обратите внимание на использование оператора уточнителя имени (: :), который отделяет имя пространства имен от локального имени.
Вот так можно обратиться к элементу
catalog. htmlNS::body
Для обращения к элементу, который является ребенком элемента , используется следующая запись:
catalog. htmlNS::body. shopNS::table
Для обращения к атрибуту shop: id используется такая запись:
catalog. htmlNS::body. shopNS::table.@shopNS::id
Для обращения к элементу мы можем использовать следующий «кошмарный» код:
catalog. htmlNS::body. shopNS: -.table. htmlNS::table. htmlNS: :tr[ 1].htmlNS::td[l].shopNS::price
Однако мы будем спать спокойнее, если воспользуемся преимуществом оператора «потомок» (. .) в двух местах, как показано в следующем коде:
catalog. .shopNS: -.table. .shopNS: :price
И все равно повторное использование shopNS: : слегка раздражает. Мы можем избежать нескольких лишних нажатий клавиш, попросив язык ActionScript автоматически уточнять все неуточненные имена элементов и атрибутов с помощью
выбранного пространства имен. Для этого мы используем инструкцию назначения пространства имен XML по умолчанию, которая имеет следующий вид:
default xml namespace = пространствоИменИлиСтрокаиЙ1
Например, следующий код заставляет язык ActionScript автоматически уточнять все неуточненные имена элементов и атрибутов с помощью пространства имен http://www. example. com/furniture:
default xml namespace = shopNS;
После выполнения этой инструкции пространство имен http: / / www. example. com/ furniture применяется ко всем неуточненным ссылкам на элементы и атрибуты, поэтому мы можем сократить следующий код:
catalog..shopNS::table..shopNS::price
до записи:
catalog..table..price
» «|СяР Из»за ошибки в приложении Flash Player 9 при выполнении предыдущего примера кода 1—1 (catalog..table..price) в первый раз возвращается значение undefined.
Руководство по actionscript. часть 3, стр. 068
В более полном примере документ каталога, скорее всего, будет содержать несколько элементов. Для обращения к определенному столу нам придется использовать фильтрующий предикат, как показано в следующем коде:
catalog..table.(@id == 4875)..price
В листинге 18.15 приведен код, который можно использовать для обращения и отображения информации обо всех столах из каталога.
Листинг 18.15. Отображение всех столов из каталога
var shopNS:Namespace = catalog. namespaceCshop»); default xml namespace = shopNS: for each (var table:XML in catalog..table) { trace(table..desc + «: » + table..price):
}
Как и в случае с именами элементов и атрибутов, мы можем использовать групповой символ свойств (*) с пространствами имен. Например, следующий код возвращает объект XMLList, представляющий все элементы