Руководство по actionscript. часть 3, стр. 025

Мы рассмотрели наш словарь! Кроме того, подошло к концу наше изучение пространств имен. Помните, что вы можете загрузить исходный код для приложения словаря и других примеров из этой главы по адресу http://www. moock. org/eas3/ examples.

Последние основные темы

Мы почти завершили рассмотрение базовых возможностей языка ActionScript. В двух последующих главах описываются две последние темы: создание и управление XML-данными и ограничения безопасности приложения Flash Player.

ПИВА IS

Язык XML и расширение Е4Х

С момента появления приложения Flash Player 5 язык ActionScript включает инструменты для работы со структурированными данными XML. В ActionScript 1.0 и ActionScript 2.0 создание и управление данными XML осуществлялось с помощью переменных и методов внутреннего класса XML (например, fir s tChi Id, next S ibl ing, appendChild( ) и т. д.). Класс XML был основан на стандарте Document Object Model (Объектная модель документа) консорциума W3C, или DOM, — стандарте для программного взаимодействия с документами XML (дополнительную информацию об этом стандарте можно найти по адресу http://www. w3.org/DOM).

В языке ActionScript 3.0 набор инструментов для создания и управления данными XML был полностью переработан. ActionScript 3.0 реализует стандарт ECMAScript for XML (Е4Х) — официальное расширение языка ЕСМА-262 для работы с данными XML в качестве встроенного типа данных. Стандарт Е4Х призван улучшить использование и гибкость работы с данными XML в языках, основанных на спецификации ЕСМА-262 (включая языки ActionScript и JavaScript).

Данные XML в виде иерархии

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

Листинг 18.1. Пример XML-фрагмента



Ulysses

Joyce. James

Penguin Books Ltd

Элементы , , и ,атакжетекст «Ulysses», «Joyce, James» и «Penguin Books Ltd» считаются узлами дерева, как показано на рис. 18.1.

Руководство по actionscript. часть 3, стр. 026

Элемент является корнем дерева, который еще называется корневым узлом структуры данных XML. Любой корректный XML-документ должен иметь всеобъемлющий корневой элемент наподобие элемента, который включает все остальные элементы.



Рис. 18.1. Пример иерархии XML

Когда узел содержится в другом узле, он называется ребенком содержащего его узла. С другой стороны, узел, содержащий узел-ребенка, называется его родителем. В нашем примере элемент является ребенком элемента, а элемент — родителем элемента.

Как ни удивительно, но элемент — это не первый по счету ребенок элемента, а второй. Первым ребенком фактически являются так называемые незначащие пробелы (новая строка и два пробела) в исходном коде фрагмента XML между тегами и. В расширении Е4Х незначащим пробелом может являться любой из следующих четырех символов форматирования: пробел (\u0020), возврат каретки (\u000D), перевод строки (\и000А)и символ табуляции (\u0009). В дереве документа XML текстовые блоки — даже если они содержат только пробельные символы — считаются узлами дерева. Таким образом, элемент имеет не три ребенка, а семь, четыре из которых являются так называемыми пробельными узлами (текстовые узлы, которые содержат только незначащие пробелы).

Семь детей узла называются узлами-братьями, поскольку они находятся на одном уровне в иерархии. Например, мы говорим, что следующим братом элемента является пробельный узел, а предшествующим братом элемента является другой пробельный узел. Вы видите, как текстовые узлы мешают при перемещении по иерархии от одного брата к другому. К счастью, по умолчанию, пробельные узлы игнорируются парсером1 расширения Е4Х. Расширение Е4Х позволяет считать элемент следующим братом элемента, что в большинстве случаев нам и нужно. В расширении Е4Х не придется обрабатывать пробельные узлы самостоятельно до тех пор, пока это действительно не потребуется (за данное поведение отвечает переменная экземпляра ignoreWhitespace класса XML, которая рассматривается далее,

Парсер — синтаксический анализатор.

в подразд. «Преобразование элемента XML в строку» разд. «Преобразование объектов XML и XMLList в строки»).

На последнем уровне иерархии мы видим, что у каждого из узлов, и есть один текстовый узел-ребенок: «Ulysses», «Joyce, James» и «Penguin Books Ltd» соответственно. Текстовые узлы являются конечными узлами в дереве.

В исходном коде XML текст, содержащийся в элементе, считается узлом-ребенком данного элемента в соответствующей древовидной иерархии документа XML.

Мы рассмотрели дерево данных XML из листинга 18.1, но по-прежнему ничего не знаем о месте атрибутов в этой иерархии. Можно предположить, что атрибут ISBN элемента превращается в узел-ребенка с именем ISBN. Однако на практике атрибут считается не ребенком элемента, определяющего этот атрибут, а его характеристикой. Мы рассмотрим способы обращения к атрибутам в расширении Е4Х далее, в подразд. «Обращение к атрибутам» разд. «Обращение к данным XML».

Теперь, когда известно, как данные XML могут быть представлены в виде концептуальной иерархии, можем рассмотреть способы представления, создания и обработки данных XML в расширении Е4Х.

Представление данных XML в расширении Е4Х

В расширении Е4Х данные XML представляются одним из двух встроенных типов данных языка ActionScript — XML и XMLList, а также их соответствующих классов с такими же именами — XML и XMLList.

Поскольку в расширении Е4Х появился тип данных XML, существующий класс XML из языков ActionScript 1.0 и ActionScript 2.0 в языке ActionScript 3.0 был переименован в класс XMLDocument и перемещен в пакет flash. mx.

Руководство по actionscript. часть 3, стр. 027

Каждый экземпляр класса XML представляет один из следующих пяти возможных типов XML-содержимого, называемых типами узлов:

? элемент;

? атрибут;

? текстовый узел;

? комментарий;

? инструкция обработки.

Если XML-элемент имеет элементы-детей (например, ребенок элемента ) или текстовые узлы-детей (например, ребенок «Ulysses» элемента ), то эти дети представляются в виде экземпляра класса XMLList из

родительского экземпляра класса XML. Каждый экземпляр класса XMLList представляет собой обычную коллекцию, состоящую из одного или более экземпляров класса XML. Например, экземпляр класса XMLList может представлять собой следующее:

? набор атрибутов или элементов, возвращаемых в результате поиска;

? группу фрагментов XML, каждый из которых имеет собственный корневой элемент;

? коллекцию текстовых узлов документа;

? коллекцию комментариев документа;

? коллекцию инструкций обработки документа.

Узлы-дети элемента, представленного экземпляром класса XML, всегда заключаются в экземпляр класса XMLList. Даже если элемент имеет только одного ребенка (скажем, только текстовый узел), этот ребенок все равно будет заключен в экземпляр класса XMLList. Если элемент XML имеет атрибуты, комментарии или инструкции обработки, все они подобным образом заключаются в объект XMLList родительского экземпляра класса XML. Однако комментарии и инструкции обработки по умолчанию игнорируются парсером расширения Е4Х (чтобы исключить игнорирование этих элементов, присвойте статическим переменным XML. ignoreComments и XML. ignore Processing]! instructions значение false).

Рассмотрим пример, демонстрирующий, как фрагмент XML представляется экземплярами классов XML и XMLList в расширении Е4Х. Вспомним исходный код XML из листинга 18.1:



Ulysses

Joyce, James

Penguin Books Ltd

С точки зрения расширения Е4Х элемент в данном коде представляется экземпляром класса XML. Он содержит два экземпляра класса XMLList — один для атрибутов элемента, а второй — для его элементов-детей. Элемент имеет только один атрибут, поэтому экземпляр класса XMLList для атрибутов элемента содержит только один экземпляр класса XML (представляющий атрибут ISBN). Экземпляр класса XMLList для элементов-детей элемента содержит три экземпляра класса XML, представляющих три элемента — , и . Каждый из этих экземпляров XML отдельно включает в себя экземпляр класса XMLList, содержащий по одному экземпляру класса XML, представляющего соответственно текстовые узлы-дети «Ulysses», «Joyce, James» и «Penguin Books Ltd». Эта структура изображена на рис. 18.2. На рисунке каждый элемент иерархии с корневым элементом обозначен буквой (от А до М), чтобы в дальнейшем было проще ссылаться на эти элементы.

Руководство по actionscript. часть 3, стр. 028

Теперь применим рассмотренную теорию на практике, создав фрагмент с корневым элементом из листинга 18.1 с помощью методик расширения Е4Х.

XML

(ISBN=»0141182806″)

| | Экземпляр класса XML (элемент)

| | Экземпляр класса XML (атрибут)

| | Экземпляр класса XML (текстовый узел)

С% Экземпляр класса XMLList

I

XML \

W () I

D

XML \

W () |

Е

XML |

W ( )|

XML (Joyce, James)

1

XML (Penguin Books Ltd)

Рис. 18.2. Фрагмент с корневым элементом, представленный в расширении Е4Х

Создание данных XML с помощью расширения Е4Х

У нас есть три основных варианта создания фрагмента XML с корневым элементом, представленного в листинге 18.1, с использованием расширения Е4Х.

Руководство по actionscript. часть 3, стр. 029

? Использовать конструктор класса XML, чтобы создать сначала новый экземпляр класса XML, а затем программным путем — оставшуюся часть фрагмента, применяя методики, описанные далее, в разд. «Изменение или создание нового содержимого XML».

? Использовать конструктор класса XML, чтобы создать новый экземпляр класса XML, а затем импортировать фрагмент из загруженного внешнего файла, как рассматривается далее, в разд. «Загрузка XML-данных».

? Ввести наши XML-данные в форме литерала, как обычную строку или число, в любом месте, где ActionScript допускает использование литералов.

Пока мы воспользуемся третьим подходом — создадим XML-фрагмент с помощью литерала XML. Это демонстрирует листинг 18.2. В нем переменной novel присваивается значение литерала XML (XML-фрагмент из листинга 18.1).

Листинг 18.2. Присваивание литерала XML переменной

var novel:XML = Ulysses Joyce. James Penguin Books Ltd ;

При выполнении предыдущего кода среда Flash создает новый экземпляр класса XML расширения Е4Х, представляющий литерал фрагмента XML, и присваивает его переменной novel.

Чтобы просмотреть исходный код XML экземпляра класса XML (наподобие экземпляра, на который ссылается переменная novel), используйте метод экземпляра toXMLString() класса XML, как показано в следующей строке:

trace(novel. toXMLString( ));

Метод toXMLString() рассматривается далее, в разд. «Преобразование объектов XML и XMLList в строки».

Обратите внимание, что использование переводов строк и кавычек в предыдущем литерале XML является абсолютно нормальным. Компилятор знает, что они являются частью данных XML, и интерпретирует их так, как это необходимо. Где это возможно, компилятор даже конвертирует определенные зарезервированные символы в сущности языка XML. Дополнительную информацию можно найти в подразд. «Использование сущностей XML для специальных символов» разд. «Изменение или создание нового содержимого XML».

Язык ActionScript также позволяет использовать динамические выражения в литерале XML, поэтому названия элементов, атрибутов, значения атрибутов и содержимое элементов можно генерировать программным путем. Чтобы указать динамическое выражение в литерале XML, включите его в фигурные скобки ({ }). Например, следующий код задает название тега динамически:

var elementName:String = «BOOK»; var novel:XML = <{elementname}/>;

Следующий код представляет слегка усложненный пример, в котором создается иерархия XML, приведенная в листинге 18.2, но при этом все названия элементов, названия атрибутов, значения атрибутов и содержимое элементов задаются динамически.

var rootElementName:String = «BOOK»; var rootAttributeName:String = «ISBN»;

var chiIdElementNames:Array = ["TITLE", "AUTHOR", "PUBLISHER"];

var book ISBN.-String = «0141182806″;

var bookTitle:String = «Ulysses»;

var bookAuthor:String = «Joyce, James»;

var bookPublisher:String = «Penguin Books Ltd»;

var novel:XML = <{rootelementname} {rootattributename}={bookisbn}> <{childelementnames[0]}>{bookTitle} <{childelementnames[l]}>{bookAuthor} <{chiidelementnames[2]}>{bookPublisher} ;

Стоит отметить, что, поскольку символы { } применяются для обозначения динамического выражения, их использование в некоторых частях литерала XML недопустимо. В частности, внутри названия элемента, названия атрибута или содержимого элемента для представления символов { и } должны использоваться сущности & #х7В; h} соответственно. Тем не менее в виде литерала символы

{ и } могут быть использованы внутри значения атрибута, раздела С DATA, инструкции обработки или комментария.

Руководство по actionscript. часть 3, стр. 030

Теперь, когда у нас появилась переменная novel, определенная в листинге 18.2, которая ссылается на фрагмент XML из листинга 18.1, рассмотрим, как можно обращаться к различным частям фрагмента с помощью методик кодирования расширения Е4Х.

Обращение к данным XML

Расширение Е4Х предлагает два основных набора инструментов для обращения к данным в иерархии XML:

? методы обращения к содержимому классов XML и XMLList (attribute ( ), attributes ( ), child ( ), children ( ), comments ( ), descendants ( ), elements ( ), parent ( ), processinglnstructions ( ) и text ( ) );

? обращение в стиле доступа к переменным с помощью операторов «точка» (.), «потомок» (. .) и «атрибут» (@).

Обращение в стиле доступа к переменным предлагается в качестве удобства для программиста и всегда соответствует вызову одного или нескольких методов класса XML или XMLList. Однако эти два подхода не являются полностью взаимозаменяемыми. Для обращения к следующим типам содержимого должен использоваться подходящий метод класса XML или XMLList:

? родитель экземпляра класса XML (обращение через метод parent ( ) );

? комментарии (обращение через метод comments ( ) );

? инструкции обработки (обращение через метод processinglnstructions ( ) );

? элементы или атрибуты, названия которых включают симролы, считающиеся недопустимыми в идентификаторе языка ActionScript (обращение через методы attribute ( ), child ( ), descendants ( ) или elements ( ) ).

Используя наш пример с корневым элементом, рассмотрим несколько наиболее распространенных способов обращения к данным XML.

Обращение к корневому узлу XML

В листинге 18.2 мы присвоили фрагмент XML из листинга 18.1 переменной novel. Для обращения к корневому элементу этого фрагмента (элемент А на рис. 18.2) мы просто используем переменную novel. Например, следующий код передает элемент (и, как следствие, всех его детей) в гипотетический метод

addToOrder ( ):

addToOrder(novel);

Обратите внимание, что элемент не имеет названия. Иными словами, мы пишем addToOrder (novel), а не так:

addToOrder(novel. BOOK); // Неправильно. addToOrder(novel. child(«BOOK»)); // Также неправильно.

Руководство по actionscript. часть 3, стр. 031

В двух предыдущих примерах элемент ошибочно считается ребенком объекта, на который ссылается переменная novel, хотя это не так. Как обращаться к элементам-детям, мы рассмотрим в следующем разделе.

Стоит отметить, что не существует прямого способа обратиться к корневому узлу из любого заданного ребенка. Однако мы можем использовать метод экземпляра parent ( ) (рассматриваемый далее) класса XML, чтобы подняться вверх по иерархии элементов к корневому узлу, как показано в листинге 18.3.

Листинг 18.3. Пользовательский метод для обращения к корневому узлу

// Возвращает корневой узел иерархии XML из любого заданного ребенка public function getRoot (chi1dNode:XML):XML { var parentNode:XML = chi1dNode. parent( ); if (parentNode!= null) {

return getRoot(parentNode); } else { return chi1dNode;

}

}

// Применение: getRoot(некийРебенок);

Обращение к узлам-детям

Для обращения к экземпляру класса XMLList, представляющего узлы-детей элемента (элемент В на рис. 18.2), мы используем метод экземпляра children ( ) класса XML, не принимающего никаких аргументов. Например:

novel. children( ) // Возвращает объект XMLList, представляющий узлы-детей // элемента

В качестве альтернативы мы можем обратиться к узлам-детям элемента с помощью более удобного группового символа свойств (*) расширения Е4Х. Например:

novel.* // Также возвращает объект XMLList, представляющий // узлы-детей элемента

Для обращения к определенному ребенку в объекте XMLList мы используем уже знакомый оператор доступа к элементу массива — [ ]. Например, чтобы обратиться ко второму ребенку элемента — элементу (элемент D на рис. 18.2), мы используем:

novel. children( )[1] // Обращаемся ко второму узлу-ребенку элемента или:

novel.// Также обращаемся ко второму узлу-ребенку элемента

Хотя в расширении Е4Х нет переменной firstChild или lastChild (как в существующем классе XMLDocument), обратиться к первому ребенку в списке узлов-детей можно следующим образом:

узел. children( )[0]

К последнему ребенку в списке узлов-детей можно обратиться следующим образом:

узел. children( )[узел. children( ).length( )-l]

Однако обращение к узлу-ребенку по его позиции в списке может быть затруднительным, и поэтому значимость данного метода обращения в расширении Е4Х была снижена. В расширении Е4Х обращение к узлам-детям обычно происходит по их именам, а не по позиции. Для обращения к узлу-ребенку по имени применяется метод экземпляра child ( ) класса XML, который возвращает объект XMLList со всеми элементами-детьми, соответствующими указанному имени. Например, чтобы получить объект XMLList со всеми детьми элемента с именем «AUTHOR», используется следующий код:

novel. child(«AUTHOR») // Возвращает все элементы-детей элемента // с именем «AUTHOR»

В качестве альтернативы мы можем обратиться к узлам-детям по имени, используя более удобный синтаксис для доступа к переменным расширения Е4Х. Следующий код возвращает такой же результат, как и предыдущий, но при этом использует более удобный синтаксис обращения к переменной расширения Е4Х:

novel. AUTHOR // Также возвращает все элементы-детей элемента // с именем «AUTHOR»

Если элемент содержит два элемента , выражение nove 1. AUTHOR вернет объект XMLList с двумя экземплярами класса XML, представляющими данные элементы. Для обращения к первому элементу мы могли бы использовать выражение novel. AUTHOR [ 0 ]. Для обращения ко второму элементу — выражение novel. AUTHOR [ 1 ], как показано в следующем коде:

var novel:XML =

Jacobs, Tom Schumacher, Jonathan
;

novel. AUTHOR[0]; // Обращение к Jacobs, Tom

novel. AUTH0R[1]; // Обращение к Schumacher, Jonathan

Безусловно, элемент из листинга 18.1 содержит только одного ребенка с именем «AUTHOR», поэтому объект XMLList, возвращаемый выражением novel. AUTHOR, имеет только один экземпляр класса XML (представляющий единственный элемент ). Для обращения к данному элементу мы могли бы использовать следующий код:

novel. AUTHORC0] // Обращение к экземпляру элемента

Однако (и это замечательно!) в большинстве случаев включать [0] не требуется. Чтобы сделать обращение к узлу более удобным, расширение Е4Х реализует специальное поведение для объектов XMLList, имеющих только один экземпляр класса XML (как в случае с выражением novel. AUTHOR в нашем примере). Когда метод класса XML вызывается над объектом XMLList, имеющим только один экземпляр класса XML, этот вызов метода автоматически переадресуется данному экземпляру. Выполняя переадресацию вызова метода, расширение Е4Х позволяет

программисту рассматривать объект XMLList с одним экземпляром класса XML так, будто данный объект XMLList и является экземпляром класса XML. Как указано в спецификации, расширение Е4Х «намеренно стирает различие между отдельным объектом класса XML и объектом класса XMLList, содержащим только его».

Руководство по actionscript. часть 3, стр. 032

Предположим, что мы хотим изменить название элемента с «AUTHOR» на «WRITER». Мы могли бы использовать следующий код, который явно обращается к экземпляру элемента :

novel. AUTHORCO].setNameC»WRITER»);

Однако обычно используется следующий более удобный код, который неявно обращается к экземпляру элемента , опуская оператор обращения к элементу массива ( [ 0 ], следующий за выражением novel. AUTHOR):

novel. AUTHOR. setName(«WRITER»);

Когда мы вызываем метод setName ( ) непосредственно над объектом XMLList, возвращаемым выражением novel. AUTHOR, среда выполнения Flash распознает, что данный список содержит только один экземпляр класса XML () и автоматически переадресует вызов метода setName ( ) данному экземпляру. В результате название единственного элемента, содержащегося в объекте novel. AUTHOR, изменяется с «AUTHOR» на «WRITER».

В большинстве случаев данный трюк языка ActionScript упрощает написание XML-кода и делает его интуитивно понятным. Однако использовать эту методику следует осторожно. Например, следующий код вызывает метод setName ( ) над объектом XMLList, который содержит несколько экземпляров класса XML:

var novel:XML =

Jacobs. Tom Schumacher. Jonathan
;

novel. AUTHOR. setName(‘WRITER’);

При выполнении предыдущего кода среда Flash сгенерирует следующую ошибку:

The setName method works only on lists containing one item.

На русском языке она будет выглядеть так: Метод setName работает только для списков, содержащих один элемент.

Представление объекта XMLList, содержащего только один экземпляр классаXML, является важным и зачастую неверно трактуемым аспектом программирования с использованием расширения Е4Х, поэтому мы будем возвращаться к этой теме несколько раз в процессе чтения данной главы.

Обращение к текстовым узлам

Как уже известно из разд. «Данные XML в виде иерархии», текст, содержащийся в элементе, представляется в виде узла в иерархии XML. Например, в следующем XML-фрагменте (повторяемом из листинга 18.2)текст «Ulysses» является текстовым узлом. Он представляется экземпляром класса XML, типом узла которого является текст, как и текстовые узлы «Joyce, James» и «Penguin Books Ltd».

Руководство по actionscript. часть 3, стр. 033

Var novel:XML = Ulysses Joyce. James Penguin Books Ltd ;

К текстовым узлам можно обращаться различными способами в зависимости от наших потребностей. Когда необходимо обратиться к текстовому узлу как к экземпляру класса XML, нужно использовать синтаксис обращения к узлу-ребенку, рассмотренный в предыдущем разделе. Например, чтобы обратиться к тексту «Ulysses», который является первым ребенком элемента, мы можем использовать следующий код:

novel. TITLE. children( )[0] // Обращаемся к текстовому узлу Ulysses

Или, в качестве альтернативы, мы можем использовать групповой символ свойств:

novel. TITLE.*[0] // Тоже обращаемся к текстовому узлу Ulysses

Оба предыдущих примера возвращают объект XML (а не строку), который представляет текст элемента » U1 у s s е s «. Мы можем вызывать методы класса XML над этим объектом точно так же, как и над любым другим объектом XML. Например:

novel. TITLE.*Е0].parent( ) // Обращение к элементу novel. TITLE.*[0].nodeKind( ) // Возвращает строку «text» novel. TITLE.*[0].toString( ) // Возвращает строку «Ulysses»

Однако если мы хотим просто обратиться к содержимому текстового узла, как к значению типа String, а не к экземпляру класса XML, то можем использовать метод экземпляра toString ( ) класса XML над его родительским элементом. Для таких элементов, как, например, , которые содержат только один текстовый узел-ребенок (без других промежуточных элементов), метод toString ( ) возвращает текст этого узла-ребенка, опуская начальные и конечные теги родительского элемента. Таким образом, выражение novel. TITLE. toString ( ) вернет строку «Ulysses»:

trace(novel. TITLE. toString( )); // Выводит: Ulysses

Обдумывая предыдущую строку кода, не забудьте, что на самом деле это сокращенный вариант следующего кода:

trace(novel. TITLE[0].toString( )): // Выводит: Ulysses

Сокращенный вариант выражения novel. TITLE. toString ( ) возвращает значение «Ulysses «, поскольку среда выполнения Flash знает, что объект XMLList, на который ссылается выражение novel. TITLE, имеет всего один экземпляр класса XML (), и автоматически переадресует вызов метода toString ( ) данному экземпляру.

При обращении к содержимому текстового узла как к значению типа String мы можем опускать явный вызов метода toString ( ), поскольку среда выполнения Flash вызывает метод toString ( ) автоматически, когда вместо строки используется нестроковое значение. Например, функция trace ( ) в качестве аргумента принимает строку, поэтому вместо явного вызова метода toString ( ):

trace(novel. TITLE. toString( )): // Выводит: Ulysses

мы можем позволить среде выполнения Flash вызвать этот метод неявно:

traceCnovel. TITLE); // Также выводит: Ulysses

Подобным образом при присваивании содержимого текстового узла Ulysses переменной типа String вместо использования такого полностью явного кода:

var ti tleName:Stri ng = novel. TITLECO].toStringC ):

мы можем использовать просто:

var ti tleName:Stri ng = novel. TITLE:

Замечательная возможность. И зачастую именно этот способ применяется для получения текста, содержащегося в элементе, в расширении Е4Х.

Руководство по actionscript. часть 3, стр. 034

Для текстовых узлов, которые разбросаны между другими элементами, можно использовать метод экземпляра text ( ) класса XML, чтобы получить текстовые узлы, не содержащиеся в элементах. Чтобы проиллюстрировать данную возможность, временно добавим элемент к элементу, как показано в следующем примере:

var novel:XML = Ulysses Joyce. James Penguin Books Ltd A Very thick book. :

Элемент содержит как элементы-детей, так и текстовые узлы-детей:

? А (текстовый узел);

? Very (элемент с текстовым узлом-ребенком);

? thick book, (текстовыйузел).

Чтобы получить объект XMLList, содержащий два текстовых узла А и thick book., мы используем следующее выражение:

novel. DESCRIPTION. text( )

Для обращения к этим текстовым узлам используется оператор доступа к элементу массива:

trace(novel. DESCRIPTION. text( )[0]); // Выводит: А trace(novel. DESCRIPTION. text( )[1]): // Выводит: thick book.

Метод text ( ) также можно применять для получения текстовых узлов из всего объекта XMLLi s t, а не только из одного элемента XML. Предположим, что у нас есть объект XMLList, представляющий всех детей элемента из листинга 18.2 (до момента добавления элемента ):

novel.*

Чтобы поместить текстовые узлы каждого ребенка из этого списка в объект XMLLi s t для последующей обработки, например, для создания пользовательского интерфейса, применяется следующий код:

novel.*.text( )

И снова для обращения к текстовым узлам мы используем оператор доступа к элементу массива:

trace(novel.*.text( )[0]): // Выводит: Ulysses trace(novel.*.text( )[1]); // Выводит: Joyce, James trace(novel.*.text( )[2]); // Выводит: Penguin Books Ltd

Однако метод экземпляра text ( ) класса XMLList оказывается менее полезным при использовании над списком элементов, который содержит и текстовые узлы-детей, и элементы-детей. Если узел содержит и текстовые узлы-детей, и элементы-детей (например, узел ), то возвращается только первый текстовый узел-ребенок; остальные дети игнорируются. Например:

var novel:XML = Ulysses Joyce. James Penguin Books Ltd A Very thick book. ;

trace(novel.*.text( )[3]): // Выводит: A

// остальные узлы-дети — Very // и thick book. — игнорируются

Обращение к узлам-родителям

Для обращения к узлу-родителю данного узла используется метод экземпляра parent ( ) класса XML, не принимающий аргументов. Предположим, что переменная pub содержит ссылку на элемент из листинга 18.2.



Полезные ссылки
Случайные записи
  • 12.11.2011">Абстрактная иллюстрация в Фотошопе
  • 01.01.2010">14 бесплатных шрифтов в стиле Web 2.0
  • 05.08.2011">МФУ от Hewlett-Packard – качество и надежность
  • 19.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.11
  • 23.01.2011">Руководство по actionscript. часть 1, стр. 082
  • 21.03.2011">Руководство по actionscript. часть 2, стр. 047
  • 17.03.2011">Руководство по actionscript. часть 2, стр. 155
  • 04.03.2011">Руководство по actionscript. часть 5, стр. 051
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.53
  • 18.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.108
  • 07.03.2011">Руководство по actionscript. часть 4, стр. 105
  • 17.03.2011">Руководство по actionscript. часть 2, стр. 157
  • 09.10.2010">Разница между растровым и векторным изображением
  • 22.01.2011">Руководство по actionscript. часть 1, стр. 143
  • 11.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.13
Опрос

Какие цвета вы предпочитаете?

View Results

Loading ... Loading ...