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

Var pub:XML = novel. PUBLISHERS];

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

pub. parent( )

Метод parent ( ) может так же успешно применяться для обращения к любому узлу-предку, как показано в следующем коде:

// Создаем иерархию XML с тремя уровнями.

var doc:XML = :

// Присваиваем ссылку на элемент var kid:XML = doc. parent. child[0];

// Используем метод parent( ) для последовательного обращения к элементу

// из элемента

var grandparent:XML = kid. parent( ).parent( );

I В отличие от методов children() и child(), метод экземпляра parent() класса XML не ft А % имеет альтернативного синтаксиса в стиле обращения к переменным.

Когда метод parent ( ) применяется к экземпляру класса XMLList, он возвращает значение nul 1, если только родителем всех элементов списка не является один и тот же элемент, который и возвращается в этом случае. Например, в следующем коде мы получаем экземпляр класса XMLList, представляющий три ребенка элемента, а затем вызываем метод parent ( ) над этим списком. Поскольку родителем всех трех детей является один и тот же элемент, возвращается этот родитель, var bookDetai Is.-XMLList = novel.*;

var book:XML = bookDetaiIs. parent( ); // Возвращает элемент

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

novel. PUBLISHER^].parentC ) // Обращается к novel. PUBLISHER. parent( ) // Также обращается к

Когда метод parent ( ) вызывается над экземпляром класса XML, представляющим атрибут, возвращается элемент, для которого этот атрибут определен. Это демонстрирует следующий код, в котором используется еще не рассмотренный метод доступа к атрибутам (этот метод будет описан в ближайшее время):

novel.@ISBN. parent( ) // Возвращает элемент

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

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

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

Var novel:XML =

Ulysses

Joyce. James

Penguin Books Ltd :

В расширении Е4Х отсутствует встроенная поддержка перемещений между узлами-братьями в иерархии XML. Переменные nextSibling и previousSibling, поддерживаемые в модели DOM, не являются частью интерфейса API расширения Е4Х. Однако следующий брат любого узла может быть получен с помощью следующего кода, предполагая, что у данного узла есть узел-родитель:

некийУзел. рагепК ) .*[^екмУзел. childlndex( )+1];

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

некийУзел. parent( ) *[некийУзел. chi1dlndex( )-1];

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

var author:XML = novel. AUTHOR[0]; // Предшествующий брат

trace(author. parent( ).*[author. childlndex( )-l]); // Выводит: Ulysses // Следующий брат

trace(author. parent( ).*[author. childIndex( )+1]); // Выводит:

// Penguin Books Ltd

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

Листинг 18.4. Пользовательский метод previousSibling()

public function previousSibling (theNode:XML):XML { // Проверяем, что узел действительно имеет предшествующего брата, // перед тем как вернуть его

if (theNode. parent( ) != null && theNode. childIndex( ) > 0) {

return theNode. parent( ).*[theNode. childIndex( )-l]; } else {

return null;

}

}

// Использование:

previ ousSi bli ng(некийУзел);

В листинге 18.5 определен метод nextSibling ( ) — метод-компаньон пользовательского метода previous Sibling ( ), определенного в листинге 18.4. Обратите внимание, что метод добавляет код для проверки, что указанный узел действительно имеет следующего брата, перед тем как вернуть его.

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

Листинг 18.5. Пользовательский метод nextSibling()

public function nextSibling (theNode:XML):XML { if (theNode. parent( ) != null

&& theNode. childlndex( ) < thenode.parent( ).children( ).length( )-l) { return thenode.parent( ).*[thenode.childindex( )+l]; } else { return null;

}

}

// Использование: nextSibling(некийУзел):

Расширение E4X уменьшает необходимость доступа к узлам-братьям, поскольку основное внимание уделяется обращению к элементам по их имени. Например, для обращения к элементу с помощью расширения Е4Х мы обычно используем простую запись novel. TITLE, а не author. parent( ).*[author. childIndex( )-1].

Обращение к атрибутам

Для обращения к объекту XMLList, представляющему все атрибуты элемента, используется метод экземпляра attributes ( ) класса XML, не принимающий аргументов. Он имеет следующий общий вид:

weK^^ewewr. attributesC )

Например, следующий код возвращает объект XMLLi st, представляющий атрибуты элемента (элемент L на рис. 18.2):

novel. attributesC )

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

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

Например, приведенный ниже код, который является эквивалентом выражения novel. attributes ( ), возвращает объект XMLList, представляющий атрибуты элемента (элемент L на рис. 18.2):

novel.@*

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

novel. attributesC )[0]

Следующий код также обращается к первому атрибуту элемента (снова ISBN), но использует синтаксис специального символа атрибутов расширения Е4Х:

novel.@*[0]

Однако ни выражение novel. @* [0] ,ни выражение novel. attributes ( ) [0] не представляют обычный код расширения Е4Х. В расширении Е4Х обращение к атрибутам редко происходит по их порядковому номеру в документе XML. Обычно к атрибутам обращаются по имени, используя либо метод attribute ( ), либо более удобный синтаксис обращения к переменным расширения Е4Х. Для обращения к атрибуту по его имени с помощью метода attribute ( ) используется следующий обобщенный код:

некийЭлемент. attгibuteC»имяАтрибу те»)

Данный код возвращает объект XMLLi st, содержащий атрибут с именем им я Атрибута элемента некийЭлемент. Например, следующий код возвращает объект XMLList, который содержит один экземпляр класса XML, представляющий атрибут ISBN (элемент М на рис. 18.2) элемента :

novel. attri bute(«ISBN»)

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

некийЭлемент.$имяАтрибута

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

novel.(aiSBN

Каки child( ), метод attribute ( ) возвращает объект XMLList, содержащий экземпляры класса XML, которые соответствуют указанному имени. Однако, поскольку два или более атрибута одного элемента не должны иметь одинаковые имена, объект XMLList, возвращаемый методом attribute ( ), всегда содержит только один экземпляр класса XML (представляющий атрибут с указанным именем).

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

Для обращения к экземпляру класса XML, который содержится в объекте XMLList, возвращаемом выражением novel. @ ISBN, мы могли бы использовать следующий код:

novel.@ISBN[0]

Но при вызове метода класса XML над данным экземпляром мы обычно опускаем оператор обращения к элементу массива ([ 0 ]), как показано в следующем коде:

novel ЖЪЪН. некийМетодКлассаХМи )

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

novel.@ISBN[0].parentC ) // Возвращает узел

является эквивалентом такого неявного кода:

novel.@ISBN. parent( ) // Также возвращает узел

С другой стороны, экземпляры класса XML, представляющие атрибуты, никогда не имеют детей и, следовательно, большая часть методов класса XML остается невостребованной. Вместо этого экземпляр класса XML, представляющий атрибут, используется всего лишь для хранения значения данного атрибута. Для обращения к значению атрибута используется метод экземпляра toString ( ) класса XML. Например, следующий код присваивает значение атрибута ISBN элемента переменной booklSBN, используя полностью явное выражение:

var booklSBN:String = novel.@ISBN[0].toStringC );

Однако не забывайте, что мы можем вызвать метод toS tring ( ) непосредственно над результатом выражения novel. @ ISBN (вместо выражения novel. @ ISBN [ 0 ] ), поскольку возвращаемый объект XMLList содержит только один экземпляр класса XML. Вот более короткая и более типичная запись:

var booklSBN-.String = novel.@ISBN. toString( ); // Опущена запись [0]

Приведенную строку кода можно сделать еще короче. Класс XML является динамическим. Таким образом, мы можем использовать возможность автоматического преобразования типов данных языка ActionScript, чтобы преобразовать значение любой переменной экземпляра класса XML к строке (правила преобразования типов данных языка ActionScript описаны в гл. 8):

var booklSBN:String = novel.@ISBN:

В данном коде переменная novel представляет экземпляр динамического класса (XML). Следовательно, когда мы присваиваем типизированной переменной booklSBN значение переменной ISBN этого экземпляра, компилятор откладывает проверку типов до этапа выполнения программы. На этапе выполнения, поскольку

тип данных переменной booklSBN является примитивным (String), значение переменной ISBN автоматически преобразуется к этому типу.

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

Достаточно удобно. Эту возможность можно использовать и для преобразования к другим примитивным типам данных. Например, следующий код преобразует значение атрибута ISBN к числу путем простого присваивания этого значения переменной с типом данных Number:

var booklSBN:Number = novel.@ISBN;

При работе с атрибутами следует помнить, что значение атрибута всегда имеет тип String, даже когда кажется, что с логической точки зрения оно должно иметь другой тип. Для использования этого значения в качестве другого типа данных (не String) необходимо выполнить его явное или неявное преобразование. Чтобы избежать неприятных сюрпризов, следует постоянно помнить о правилах преобразования типов данных, которые были рассмотрены в гл. 8. В частности, запомните, что строковое значение «false» преобразуется в значение true типа Boolean! По этой причине при работе с атрибутами, которые хранят булеву информацию, проще использовать сравнение строк, чем преобразовывать значение атрибута к типу данных Boolean.

Например, следующий код добавляет новый атрибут INSTOCK, который обозначает доступность книги в настоящий момент, к элементу. Чтобы отобразить сообщение о доступности книги, сравним значение выражения novel. @INSTOCK со строкой «false» вместо того, чтобы преобразовывать значение выражения novel. @ INSTOCK в значение типа Boolean. Перед сравнением в качестве меры предосторожности мы также преобразуем все символы значения атрибута к нижнему регистру.

I При сравнении атрибутов помните, что они всегда являются строками, а сравнение j « выполняется с учетом регистра символов.

fly_

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

// Сравниваем со строкой «false» вместо преобразования в тип Boolean if (novel. LINSTOCK. toLowerCase( ) == «false») {

traceC’Not Available!»): } else {

traceC’Available!»):

}

Обращение к комментариям и инструкциям обработки

Двумя последними типами узлов, к которым можно обращаться с помощью расширения Е4Х, являются комментарии и инструкции обработки. Комментарии языка XML имеют следующий вид:



Инструкции обработки языка XML принимают такой вид:



Для обращения к этим двум вспомогательным типам данных можно использовать методы экземпляра comments ( ) nprocessinglnstructions( ) класса XML. Оба метода возвращают объект XMLList, представляющий всех непосредственных детей элемента, которые являются либо комментариями, либо инструкциями обработки соответственно. Однако по умолчанию парсер расширения Е4Х игнорирует и комментарии, и инструкции обработки. Чтобы получить доступ к комментариям документа XML или фрагмента XML, перед обработкой данных переменной XML. ignoreComments необходимо присвоить значение false, как показано в следующем коде: XML. ignoreComments = false:

Подобным образом, для того чтобы получить доступ к инструкциям обработки документа XML или фрагмента XML, перед обработкой данных переменной XML. ignoreProcessinglnstructions необходимо присвоить значение false, как показано в следующем коде:

XML. ignoreProcessinglnstructions = false:

Следует обратить внимание на то, что переменные XML. ignoreComments и XML. ignoreProcessinglnstructions являются статическими, значения им присваиваются через класс XML, а не через отдельные экземпляры класса XML. Значения, присвоенные переменным XML. ignoreComments и XML. ignoreP rocessinglnstructions, влияют на все последующие операции обработки XML-данных.

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

В листинге 18.6, например, с корневым узлом добавляются два комментария и две инструкции обработки, а также показано, как обращаться к добавленным элементам. Обратите внимание, что переменным XML. ignoreComments и XML. ignoreProcessinglnstructions присваивается значение false до того, как литерал XML будет присвоен переменной novel. Обратите также внимание, что, хотя комментарии и инструкции обработки разбросаны между детьми элемента, методы comments ( ) nprocessinglnstructions( ) игнорируют других детей и возвращают список, состоящий только из комментариев и инструкций обработки.

Листинг 18.6. Обращение к комментариям и инструкциям обработки

XML. ignoreComments = false:

XML. ignoreProcessinglnstructions = false:

// Создаем XML-фрагмент, который содержит комментарии и инструкции обработки var novel:XML =





Ulysses

Joyce, James


Penguin Books Ltd



trace(novel. comments( )[0]); //

trace(novel. comments( )[1]); //

trace(novel. processingInstructions( )[0]); //

trace(novel. processingInstructions( )[1]); //

Чтобы получить объект XMLList, представляющий все комментарии и инструкции обработки для всего дерева XML (а не только непосредственных детей узла), используйте оператор «потомок» в сочетании с групповым символом свойств, как показано в следующем коде:

var tempRoot:XML = : tempRoot. appendChi1d(novel):

trace(tempRoot..*.comments( )[0]); // Первый комментарий в документе

Мы рассмотрим представленный метод более подробно далее, в разд. «Обход деревьев XML».

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

Обращение к атрибутам и элементам

с зарезервированными символами в именах

Если имя атрибута или элемента содержит символ, который считается недопустимым для использования в идентификаторах языка ActionScript (например, дефис), вы не сможете обратиться к этому атрибуту или элементу с помощью оператора «точка». Вместо этого необходимо использовать метод attribute ( ), child ( ) или оператор [ ]. Например:

var saleEndsDate:XML = February 1, 2006 trace(saleEndsDate. mME-ZONE); // НЕДОПУСТИМО! He делайте так.

trace(saleEndsDate. attribute(«TIME-ZONE»)): // Допустимо. Делайте так. traceCsaleEndsDate.@["TIME-ZONE"]): // Тоже допустимо.

В случае с недопустимым кодом saleEndsDate. @ TIME-ZONE среда выполнения Flash трактует дефис как операцию вычитания и интерпретирует выражение как saleEndsDate. @Т1МЕ минус ZONE! По всей видимости, переменная (или метод) с именем ZONE не существует, поэтому среда выполнения Flash сгенерирует следующее сообщение об ошибке:

Access of undefined property ‘ZONE’

По-русски это будет выглядеть так: Обращение к неопределенному свойству ‘ZONE’.

Однако если бы переменная ZONE существовала, ее значение было бы вычтено из пустого объекта XMLList, представленного выражением saleEndsDate. @Т1МЕ, и никакой ошибки не возникло бы! Без сообщений об ошибках неправильное обращение к элементу saleEndsDate. @TIME-ZONE будет очень сложно выявить. Принимая во внимание, что атрибут saleEndsDate. @TI ME не существует, нам бы хотелось, чтобы среда выполнения Flash сгенерировала ошибку «несуществующего атрибута», но, к сожалению, в версии спецификации Е4Х, реализованной в языке ActionScript 3.0, оговаривается, что в результате обращения к несуществующим атрибутам должен возвращаться пустой объект XMLL i s t, не приводя к возникновению ошибки. Будущие версии языка ActionScript могут исправить эту ситуацию.

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

Интерпретация объекта XMLList как экземпляра класса XML

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

novel. AUTHORC0].setName(«WRITER»):

эквивалентно выражению:

novel. AUTHOR. setNameC»WRITER»): // Опущен [0]

Они являются эквивалентными, потому что выражение novel. AUTHOR ссылается на объект XMLList, содержащий всего один экземпляр класса XML (элемент ).

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

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

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

В нашем коде мы создаем метод displayAuthor ( ), который выводит имя автора. В первой реализации метода мы будем требовать, чтобы имя автора передавалось в виде строки:

public function displayAuthor (name:String):void { // authorField ссылается на экземпляр класса TextField, // в котором отображается имя автора authorField. text = name;

}

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

displayAuthor(novel. AUTHOR):

Данная инструкция проста и интуитивно понятна, но, как мы уже знаем из этой главы, «за кадром» происходит очень много действий. В качестве повторения проанализируем, как это работает. Во-первых, среда выполнения Flash передает выражение novel. AUTHOR в метод displayAuthor ( ) в качестве значения параметра name. Типом данных параметра name является String, поэтому среда Flash автоматически пытается преобразовать значение выражения novel. AUTHOR в строку, используя следующее выражение:

novel. AUTHOR. toString( )

По умолчанию вызов метода toString ( ) над объектом возвращает строку в формате [obj ect ИмяКласса], но выражение novel. AUTHOR представляет экземпляр класса XMLList, а класс XMLList переопределяет метод toString ( ) собственной версией. В частности, версия метода toString ( ) класса XMLList узнает, что значение выражения novel. AUTHOR содержит только один элемент, поэтому возвращается результат вызова метода toString( ) класса XML над этим элементом. Таким образом, вызов novel. AUTHOR. toString ( ) автоматически преобразуется в вызов novel. AUTHOR [ 0 ] . toString ( ). Что же является возвращаемым значением выражения novel. AUTHOR [ 0 ] . toString ( )? Как мы уже знаем, ответ основан на факте, что выражение novel. AUTHOR [0] представляет простой элемент XML, который не содержит других элементов-потомков. Для элемента XML, не содержащего других элементов, метод toString ( ) класса XML возвращает текстовый узел данного элемента в виде строки, исключая охватывающие теги. Значит, выражение novel. AUTHOR [0] .toString( ) в качестве окончательного значения, передаваемого в метод displayAuthor ( ), вернет значение «Joyce, James» (а не «Joyce/ James«).

Подведем итоги.

? Передача значения выражения novel. AUTHOR в качестве параметра типа String приводит к неявному преобразованию значения выражения novel. AUTHOR в строку.

? Значение выражения novel. AUTHOR преобразуется в строку с помощью вызова novel. AUTHOR. toString ( ).

? Выражение novel. AUTHOR. toString ( ) автоматически возвращает результат выражения novel. AUTHOR [ 0 ] . toString ( ), поскольку значение выражения novel. AUTHOR представляет экземпляр класса XMLList с одним-единственным элементом.

? Выражение novel. AUTHOR [0] . toString ( ) возвращает текст, содержащийся в элементе («Joyce, James»), в соответствии с реализацией метода toString ( ) класса XML (дополнительную информацию можно найти далее, в разд. «Преобразование объектов XML и XMLList в строки»).

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

После всего сказанного и сделанного выражение

displayAuthor(novel. AUTHOR);

преобразуется в выражение

displayAuthor(«Joyce, James»);

которое мы и предполагали увидеть.

В большинстве случаев мы можем игнорировать предыдущее усложнение, поскольку расширение Е4Х, говоря ненаучным языком, «делает то, что подразумевается». Однако существуют моменты, когда необходимо понимать действия «автопилота» в лице расширения Е4Х, чтобы осуществлять «ручное управление». Предположим, мы решили, что в книжном магазине должно выводиться не только имя, но и дата рождения каждого автора. Изменим структуру нашего фрагмента XML, чтобы включить дату рождения в качестве ребенка элемента , как показано в следующем коде:

var novel:XML = Ulysses

Joyce, James

February 2 1882

Penguin Books Ltd

Соответственно изменим метод displayAuthor ( ), чтобы он принимал элемент в качестве параметра и получал имя и дату рождения автора непосредственно из элементов-детей и :

public function displayAuthor (author. XML):void { authorField. text = «Name: » + author. NAME

+ » Birthdate: » + author. BIRTHDATE;

}

Обратите внимание, что в данном коде тип данных параметра был изменен с типа String на XML. Если сейчас мы попытаемся передать значение выражения novel. AUTHOR в метод displayAuthor ( ), на этапе выполнения возникнет ошибка несоответствия типов, поскольку среда Flash не может осуществить неявное преобразование значения выражения novel. AUTHOR (которое является объектом XMLList) к экземпляру класса XML:

displayAuthor(novel. AUTHOR); //Ошибка #1034: Ошибка операции приведения

//типов: невозможно преобразовать XMLList в XML

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

di splayAuthor(novel. AUTHOR[0]); // Передаем единственный экземпляр класса

// XML, принадлежащий значению выражения’ // novel. AUTHOR, в метод displayAuthor( )

Обратите внимание на важное отличие: когда мы хотим обратиться к тексту, содержащемуся в элементе , как к значению типа String, мы можем положиться на автоматическое поведение расширения Е4Х. Однако когда мы хотим обратиться к настоящему экземпляру класса XML, представляющему элемент , то должны явно ссылаться на этот экземпляр.

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

Теперь предположим, что нас попросили изменить наш магазин для поддержки книг с несколькими авторами. Мы снова изменим структуру нашего XML-фрагмента, чтобы включить несколько элементов . В листинге 18.7 представлен пример фрагмента XML, демонстрирующий новую структуру (даты рождения авторов являются вымышленными).

Листинг 18.7. Фрагмент с несколькими авторами

var oopBook:XML = Head First Design Patterns

Eric Freeman

January 1 1970



E1i sabeth Freeman

J a n u a ry 1 1971


Kathy Sierra

Ja nua ry 1 1972


Bert Bates

January 1 1973

0′Reilly Media, Inc ;

Для работы с новой структурой XML мы изменим метод displayAuthor ( ), чтобы он принимал объект XMLList, представляющий несколько элементов (а не один элемент из предыдущего примера). В новой версии метода displayAuthor ( ) для перемещения по элементам используется инструкция for-each-in (мы рассмотрим использование инструкции for-each-in далее, в разд. «Обработка данных XML с помощью циклов for-each-in и for-in»).

public function displayAuthor (authors:XMLList):void { for each (var author:XML in authors) { authorField. text += «Name: » + author. NAME

+ «, Birthdate: » + author. BIRTHDATE + «\n»;

}

}

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

di splayAuthor(oopBook. AUTHOR);

Эта строка кода соответствует нашему первоначальному подходу, а именно: displayAuthor(novel. AUTHOR);

На этот раз объект XMLLi st передается непосредственно в метод di splayAu thor ( ) без преобразования, поскольку типом данных получаемого параметра является XMLList, а не String. И снова обратите внимание на отличие: если при передаче объекта XMLList в функцию мы хотим преобразовать список в значение типа String, то для получаемого параметра указываем тип данных String и позволяем «колдовать» расширению Е4Х. Однако если мы хотим сохранить тип данных списка, то должны указать XMLList в качестве типа данных получаемого параметра. И сама ссылка (oopBook. author), и тип данных получаемого параметра (authors) оказывают влияние на поведение кода.



Полезные ссылки
Случайные записи
  • 11.03.2011">Руководство по actionscript. часть 4, стр. 002
  • 03.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.58
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.119
  • 04.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.21
  • 12.03.2011">Руководство по actionscript. часть 3, стр. 127
  • 02.03.2011">Руководство по actionscript. часть 5, стр. 080
  • 11.03.2011">Руководство по actionscript. часть 4, стр. 015
  • 16.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.17
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.106
  • 02.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.123
  • 22.03.2011">Руководство по actionscript. часть 2, стр. 003
  • 16.03.2011">Руководство по actionscript. часть 3, стр. 013
  • 03.03.2011">Руководство по actionscript. часть 5, стр. 065
  • 16.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.21
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.120
Опрос

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

View Results

Loading ... Loading ...