On-Line Библиотека www.XServer.ru - учебники, книги, статьи, документация, нормативная литература.
       Главная         В избранное         Контакты        Карта сайта   
    Навигация XServer.ru








 

XML? Что? Кто!? Кто же ON !!? ...on - XML!!!

Уильям Брэдберри

XML? Что? Кто!? Кто же ON !!? ...on - XML!!!

Да..!
Да-да...
Он самый.
Позвольте представить - onXML!

На самом деле onXML это новый обработчик объекта XML во флэше...
А точнее такой его ветви, как SOCKET...

Поэтому сейчас я коснусь лишь его имени, я покажу вам ту САМУЮ дверь
и предоставлю вам решать самим, стоит ли заходить в нее,
так как этот урок будет расчитан на самых маленьких ;),
на тех, кто не был знаком до этого с этим замечательным существом
из трех букв...
имя которому:

X... (но-но!!)
M...(гусары - МОЛЧАТЬ!!!)
L...

Отступая немного от темы скажу, лишь, что мне показал эту дверь и снабдил необходимыми инструкциями
мой учитель John.
За что ему отдельное спасибо ;)= .

И так - XML во FLASH MX.

'XML' на самом деле штука совсем не сложная.
'XML во FLASH' штука еще более простая, чем 'XML'.

Например вот это:

<this_is_XML />

Это и есть тот самый 'XML во FLASH'.
И все?
Да-да.
Все.

Не правда ли просто?
Для того, чтобы флэш что-то понял, достаточно этой одной строки.

Теперь договоримся с вами, что мы не будем рассматривать все подробно и целиком.
(только дверь)

И также не будем пользоваться 'виртуальными' понятиями (".. создади-и-и-иим некий объект, а зате-е-е-е-ем возмоо-о-ожно,
обратившись к его прототи-и-и-и-ипу создадим в нем некий ме-е-е-е-етод")

а будем делать только то, что можно сразу 'потрогать' (глазами) и использовать.

Я в свою очередь обещаю сильно не запугивать вас страшными словами,
такими, какими меня запугивал в свое время Джон:

ОБЪЕКТЫ
МЕТОДЫ
КЛАССЫ
КОНСТРУКТОР
ПАРСЕР и т.д.

но некоторые вещи все же придется рассмотреть... =)


"глава 1"
КТО ТАКИЕ НОДЫ.
"Ноды, это такие уроды, которые... бегают по углам..."

Стоп-стоп-стоп!
Они совсем не уроды.
Из нодов состоит весь XML.

<this_is_XML />

Вот это НОД.

В примере он единственный. Но это совсем не значит, что он неповторимый.

Вот, например это:

<this_is_XML /><this_is_XML /><this_is_XML /><this_is_XML /><this_is_XML />

XML состоящий из пяти одинаковых нодов
(Э-э-э-э-э-й!! (крик из зала), что это за фигня-я-а-а-а-а-а!!!)

- Ой! ..да-да-да, прошу прощения...
всю эту ... ммм... 'хрено....но....нодень' совсем нельзя потрогать... тем более использовать...

.......... ОТКРОЕМ НАШИ УЧЕБ..... тьфу, редактор 'FLASH MX (tm)'

Сохраним файл с каким-нибуди хитрющим названием, к примеру "my_best_maso_sado_porno_test_XML.fla :)",
иль еще како названье собразим...
и приступим к созданию первого нашего обработчика XML.

Шаг1

Для того, чтобы видеть результат нашей работы, нам необходимо хотя бы одно текстовое поле.
Теперь во FLASH MX для этого достаточно нескольких волшебных фраз :)
Выделим первый кадр, по правому клику выберем в выпадающем списке ACTIONS
и в окошко ACTIONS впишем приведенное ниже.

//-------------------[code] ---------copy-paste ------------------------>>>
//:::::::::::::::::: СОЗДАНИЕ ТЕКСТОВОГО ПОЛЯ ::::::::::::::::::::
_root.createTextField("myTextField",1,0,0,400,600);

// где [ myTextField ] - имя текстового поля (instance name)
// 1 - _level1 - в котором мы его создаем
// 0,0 - координаты верхнего левого угла поля
// 400,600 - высота и ширина оного
myTextField.text = "YO!";// запихнем на пробу какой-нибудь текст в поле...

нажмем CTRL+ENTER (test movie);
//. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
- Иванов!
-Я!
Петров!
-Я!
-Деццл!

-YO!
//. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

..и вот, сотворив сие маленькое чудо, мы можем увидеть воочию теперь....
НОД!
Шаг2

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

напишем:
myXML = new XML("<this_is_XML />");
myTextField.text = myXML;

(Джон, помнится пугал меня тогда страшным словом ОБЪЕКТ,
которым на самом деле и называется это пространство)

...только смысла в этом немного, поскольку увидим мы просто то,
что написали и работать с этим пока совсем не интересно.
Да и на самом деле мы увидим не наш первый НОД, а весь XML, который там есть
(который впрочем тоже сам по себе один большой НОД =))...

Чтобы увидеть именно первый НОД в 'myXML', надо написать хотя бы его порядковый номер.
А поскольку он у нас там один и самый первый, то можно увидеть его так:

myTextField.text = myXML.firstChild;

От ШАЙТАН!
Мы опять увидели тоже самое ;)=!
Но это уже ничего, так как теперь понятно, что в той штуке, которую мы назвали "myXML"
есть какой-то firstChild (первый ребенок).
Вот этот firstChild и есть наш первый увиденый НОД.

FIRSTCHILD

firstChild - первый ребенок.

или вот так:
myTextField.text = myXML.childNodes[0];

или так:
myTextField.text = myXML.lastChild;
но об этом после...

Покопаемся в его содержимом!
НОД такая упрямая вещь, что обязательно должна начинаться и заканчиваться, иначе интерпр...пр..пр...
тьфу..., обработчик выдаст ошибку
(или просто нифига не выдаст, а мы будем тупо нажимать коннект... рефреш...)

Поэтому усвоим, что у нашего первого НОДа есть начало
"<"
такая скобочка
есть какое-то имя (nodeName)
"this_is_XML"
и есть конец!
"/>"
но это еще не конец! =)
НОД может выглядеть совсем не так, но останется он почти тем же самым нодом
Например перепишем скрипт вот так:

myXML = new XML("<this_is_XML></this_is_XML>");
myTextField.text = myXML.firstChild;

Вах! =)
И мы все-равно увидим наш первоначальный вариант!
Хотя НОД теперь вот такой:

<this_is_XML> -- так НОД открываеися
</this_is_XML> -- а так закрывается

Про разницу я расскажу позже.
Запомним только одну важную вещь:
НОД должен - иметь - начало - и конец!

Еще пару слов про наш НОД и хватит уже переливать из пустого в порожнее...
Ноды полезны тем, что им можно придумывать любые имена (начинающиеся с буквы, про числа не помну-йа)
и запихивать в них самую разнообразную информацию (любую придуманую).
"..хочешь...., я угадайййюю, как тя зовут ?..."

В нашем же НОДе пока есть только имя.
Перепишем скрипт вот так:

myXML = new XML("<this_is_XML_node></this_is_XML_node>");
myTextField.text = myXML.firstChild.nodeName;

И мы узнаем как тя зовут =)
А точнее увидим nodeName фёрстчайлда!

здесь firstChild - это и есть самый первый нод в myXML.

например:
myTextField.text = myXML.nodeName //- не имеет никакого имени (null)

(хотя myXML это тоже сам по себе НОД.)
но его мы трогать не будем.

а вот
myTextField.text = myXML.firstChild.nodeName //- уже выдаст нам "this_is_XML_node"...

А еще есть

LASTCHILD

lastChild - последний ребенок

lastChild - это будет самый последний НОД в указаном списке.

написав:
myTextField.text = myXML.lastChild.nodeName
мы получим тоже самое, что и в случае с firstChild, но только потому, что он всего один
и является одновременно и первым и последним.

На этом и оставим нашего первого НОДа кувыркаться в своей песочнице
И заглянем в детский садик (там этих Child-ов целая куча будет ;)= )


"глава 2"
СКОЛЬКО МАЛЬЧИКОВ ТУТ?.. РАЗ-ДВА-ТРИ-И-И....
"сколько девочек тут? ван-ту-фрииии"

Иногда нужно узнать, сколько НОДов у нас есть всего...
Устроить им построение, или перепись населения.. или... еще какой базар.
Для этого придумали почетную фишку господа изобретатели всей этой XML-ёвой ерунды...
Она называется:

CHILDNODES

Перепишем скрипт вот так:

myXML = new XML("<this_is_XML_node1/><this_is_XML_node2/><this_is_XML_node3/><this_is_XML_node4/>");
myTextField.text = myXML.childNodes;

И увидим мы длииииинную цепочку нодов, которые есть в 'myXML' =).
На самом деле "childNodes" это и есть цепочка нодов (или помню еще такое жжжуткое слово МАССИВ (array))!
А для того, чтобы их всех посчитать придумали способ (свойство - гы), который подходит для любого массива во флэше.

LENGTH - длина

anyArray.length - соответсвенно, длина массива "anyArray".
myXML.childNodes.length - тоже длина, но уже нашего массива "myXML.childNodes".
Напишем:

myXML = new XML("<this_is_XML_node1/><this_is_XML_node2/><this_is_XML_node3/><this_is_XML_node4/>");
myTextField.text = myXML.childNodes.length;

И увидим число "4" - именно столько у нас сейчас НОДов.
Теперь можно их(НОДов) даже построить!

Сделаем цикл, в котором по очереди возьмем по одному НОДу и спросим у него ИМЯ.
Цикл начинается с FOR...
И запомним, что массив всегда начинается с нуля.

Напишем:

myXML = new XML("<this_is_XML_node1/><this_is_XML_node2/><this_is_XML_node3/><this_is_XML_node4/>");
for(i=0;i<myXML.childNodes.length;i++)
{
myTextField.text+=myXML.childNodes[i].nodeName+"\n";
}

Цикл работает следующим макаром:
берет некое число "i"
и начинает от нуля прибавлять к нему по 1 (++) до тех пор, пока "i" меньше, чем длина нашего массива.
подставляя это самое "i" в строку "myXML.childNodes[i].nodeName" в квадратные скобочки,
тем самым вызывая (приготовьтесь пугаться) ЭЛЕМЕНТ МАССИВА С ИНДЕКСОМ РАВНЫМ "i".
То есть обходит наш XML по порядку....

(Признаюсь, когда я впервые это услышал, мастер Джон потом меня долго искал по всем этажам,
взывая к моему разуму и дрожащим пяткам.)

..потом .вставляет, полученное, в текстовое поле("myTextField.text") по одной строке прибавляя к уже имеющимся строкам
с помощью "+="
А вот символ "\n" - позволяет сделать перенос каждой строки, когда мы подставляем его в самый конец.
Получается красивый столбик =).
Столбик из состоящий из имен!
Или список.

Только имена какие-то совсем дурацкие и для детсада не подходят совсем.
Нужны другие.

Давайте придумывать их вместе:

НОД первый будет Миша!
"<Misha/>"
Вторым пусть будет Саша.
"<Sasha/>"
Третьей бусть пудет Оля.
"<Ola/>"
И четвертым будет пусть Шамиль.
"<Shamil/>"

Но какие же детишки, да без игрушек? А?.. поэтому..
Снабдим их всех игрушками (toy)!
и перепишем имена (НОДы) заново.
Теперь они будут выглядеть так:

Мише дадим мячик (Mайкл Jordan, паимаишь)
<Misha toy="machik"/>

Саше дадим солдатика (Саша-Лебедь)
<Sasha toy="soldatik"/>

Оле, конечно - куклу (мошенничество. статья 159 УК).
<Ola toy="kukla"/>

А Шамилю - пистолет (ага, а потом рацию и отряд головорезов)!
<Shamil toy="gun"/>

Иначе говоря сухим языком флэшеров (Я ACTION SCRIPT бы выучил только за то, что им разговаривал Смольный!):

- теперь у всех НОДов в нашем импровизированом садике появились....
А Т Р И Б У Т Ы !

ATTRIBUTES

Атрибуты - это и есть та самая информация, которую можно придумывать и запихивать в ноды.
... и к сожалению на этом их польза оканчивается =)), но тут нельзя унывать...
потому, что из атрибутов можно вытащить почти все, на что способен XML!

Запомним:
Каждый атрибут в НОДе - может иметь только свое имя и не повторяться!
Атрибутов в НОДе может быть много, а может и не быть совсем.

Можно составлять из них отряды, полкИ, и целые армии для всяких-там-баз-данных, бухгалтерских списков и прочей ерунды,
вобщем создавать свой O R D N U N G (порядок), за который буржуи обычно платят свои баксы.
(ух, как я их ненавижжжу...
ага
чесслово
баксы...
ненавижу...
... тратить... =)
патамушта хоцца , чтобы было побоООООльше! )

Только погодите немного запихивать все это в new XML()....
Еще не все.
- А А А А А Т Т Т Т Т Р Р Р Р Р Р Я Я Я Я Я Д Д Д Д Д С Т Т Т Т Т Р Р Р Р Р Р О О О О ООЙЙСЯ!


"глава 3"
Командовать парадом буду Я!
"..как художник - художнику...
А вы рисовать уме
е
те?"

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

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

во флэш - XML надо.. ппп.пппп....ппп....п....ппп.....

ПАРСИТЬ!
ПАРСИТЬ!
ПАРСИТЬ!
ПАРСИТЬ!
ПАРСИТЬ!
ДА - ДА - ДА! ПАРСИТЬ!
Вот он где заныкался руль XML!

Откроем ЛЮБОЙ текстовый редактор (я, лично юзаю ULTRAEDIT 'http://www.ultraedit.com')
и напишем в нем (без табуляции):

<Misha toy="machik"/>
<Sasha toy="soldatik"/>
<Ola toy="kukla"/>
<Shamil toy="gun"/>

А затем сохраним файл в ту же дирректорию, что и наша FLA-ха.
С любым расширением.
(В миру принято сохранять такие файлы как *.xml)
Допустим "myxml.xml".

Пишем заново скрипт:
// ::::::::::::::::::::::::::::::::::: ЭТИ ТРИ СТРОКИ МЫ В ДАЛЬНЕЙШЕМ БУДЕМ ИСПОЛЬЗОВАТЬ БЕЗ ИЗМЕНЕНИЙ ::::::::::::::::
myXML = new XML(); // это мы уже знаем - создаем (резервируем пространство для XML)
myXML.ignoreWhite = true; // вот эта замечательная вещь позволит пропустить символы переводов строки между нодами и разрешит нам в редакторе писать все в столбик, а не в одну строку
myXML.load("myxml.xml"); //а эта изумительная штука пошлет команду серверу - начать парсинг (загрузку) XML во флэш
// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

myXML.onLoad = function(success)
{
if(success == true)
{
for(i=0;i<myXML.childNodes.length;i++)
{
var name = myXML.childNodes[i].nodeName;
var toy = myXML.childNodes[i].attributes.toy // вот тут-то мы и вытащим из НОДа определенный атрибут(здесь 'toy'), но он может быть любым другим.
myTextField.text+=(name +"\t играет в "+toy+" \n");
}
}
}
//. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Это совсем уже не похоже на тот детский садик, что был раньше...
Потому, что теперь у нас есть

ONLOAD

onLoad - эта штука срабатывает тогда, когда приходит ответ от сервера и называется она
(уже не боимся?)
МЕТОДОМ ОБЕКТА XML.

поэтому мы и сделали из нее нашу функцию
("http://www.flasher.ru/tutorial/viewtut.php?id=57")
которая будет выполняться тогда, когда к нам приходит...

SUCCESS

success (на самом деле хоть горшком напиши).... - такая полезная штучка
(аргумент функции 'myXML.onLoad', ухх... мои коленки),
которая, придя от сервера скажет нам всего одно слово true, или false, в зависимости от того, какой ответ пришел.
Если true - значит ответ пришел вместе с запрашиваемым XML-ем,
если false - то фигвам-народная-индейская-изба - в ответ придет какая-нибудь серверная ерунда.

Ну а пока наш сервер это совсем даже не сервер, а просто родимый локальный винт.
И кроме true он нам ничего не должен возвращать.
Поэтому протестировав нашу сцену (CTRL+ENTER)
Мы увидим картинку следующего содержания


Почти таблица.
Первый столбик - имя
Второй столбик - "играет в:" + какая-то игрушка.
Немного нелогично и еще некрасиво, но это ерунда, поверьте.


"глава 4"
А ГДЕ ЖЕ САДИК?...
"...Миша в очередной раз заехал по лбу Шамилю мячиком
Шамиль пообещал израсходовать весь боезапас своего GUNa в любимую игрушку Миши
..но поскольку, покупая патроны Шамиль воспользовался, одолженой у Оли фальшивой куклой,
то получив хорошего пинка под тощий зад от солдатиков Саши (за то, что пытался
нае...хать... да еще с бумагой вместо кэша...), поспешно ретировался восвояси, затаив злобную АбЫду..."

Беспорядочное брожение НОДов пора на этом закончить.
А если быть точнее, то не брожение, а вложение.

Давайте заключим наших злобных монстров-детишек в просторный и светлый детский садик.
Перепишем файл "myxml.xml" вот так:

<detskiy_sadik>
<Misha toy="machik"/>
<Sasha toy="soldatik"/>
<Ola toy="kukla"/>
<Shamil toy="gun"/>
</detskiy_sadik>

Теперь если мы воспользуемся первоначальным скриптом:

myTextField.text = myXML.firstChild;

То никаких детей мы не увидим.
Потому, что теперь firstChild-ом стал

<detskiy_sadik></detskiy_sadik>

Вот тут и можно понять разницу между такой записью:
<node/>
и вот такой:
<node></node>

вот такой НОД: "<node/>" - это на самом деле обрубок, бобыль, холостяк =), который уже не может иметь своих детей
то есть других вложеных НОДов у него быть не может и внутре у ней могет быть разве, что неонка какая.

а вот такой НОД: "<node></node>" - может иметь бесчисленое (ну, в разумных пределах, конечно)
множество детишек (childNodes) и вложений
например:

<node>
<node>
<node>
<node>
<node/>
<node>
<node/>
</node>
<node/>
</node>
</node>
</node>
</node>

Стоп... я же обещал не строить всяких там ракет...
..а посему...
вернемся в детский садик.

И так, обратившись к первому НОДу мы с удивлением обнаружили пропажу детишек
и появление на их месте громоздкой конуры с решетками 'detskiy_sadik'.
Не стоит удивляться сильно.
Потому, что мы преспокойно можем зайти внутрь.

зная о том, что myXML.firstChild - теперь это детский садик мы сделаем так:

sadik = myXML.firstChild; // и теперь садик - это садик, а не какой-то там firstChild

И отталкиваться дальше можно уже исходя из САДИКА.
написав:
myTextField.text = sadik.firstChild;
или
myTextField.text = sadik.childNodes[0]; // отсчет начинается с нуля!
тем самым зайдем внутрь НОДа "sadik"
И увидим Мишу с мячиком=)

написав:
myTextField.text = sadik.childNodes[1];

Мы увидим Сашу с солдатиком

написав:
myTextField.text = sadik.childNodes[2];

- Олю с куклой.

и написав:
myTextField.text = sadik.childNodes[3];
или
myTextField.text = sadik.lastChild; // так как мы знаем, что он последний в списке (lastChild - выдает последнего)

- увидим злобного Шамиля с пистолетом, которого воспиталка
поставила в угол, за то, что он кидался деревянными кубиками в Олю во время тихого часа.

Теперь, наконец, мы умеем доставать этих чертиков из коробочки.

В качестве примера, давайте узнаем, какая игрушка у Оли (а то на память полагаться нельзя)
(говоря сухим языком (еле-еле так.юю) вытащим атрибут "toy" из НОДа "Ola")

myTextField.text = sadik.childNodes[2].attributes.toy;
// правильно - кукла

И в качестве домашнего задания, отберите игрушку у Шамиля сами двумя разными способами.
и занесите ее в протокол... тьфу... хотя бы в текстовое поле.

myTextField.text = ..........[ DZ ]..........;

Есть еще третий жестокий и очень удобный способ отобразить список НОДов.
Это убийство.
Я расскажу как это делать и составлю зелье оное на основе скрипта,
но по религиозным соображениям не стану
пускать его в неблагое дело даже под прикрытием святаго-TEST-MOVIE - режима.
И так, помолясь...

Есть такое оружие супротив любого НОДа и название ему

removeNode();

Написав это после любого НОДа можно уничтожить его со всеми потрохами.
(например: myXML.removeNode(); - уничтожит весь наш "myXML")
И если теперь мы зайдем в садик...

// тут мы построим мясорубку, которая не остановится до тех пор, пока не перебъет всех...
while (sadik.firstChild !=undefined)
{
myTextField.text += sadik.firstChild.nodename
sadik.firstChild.removeNode();
}
//:::::::::::::::::::::постройка мясорубки окончена::::::::::::::::::::::::::::::::::::::::::::::::::::

while - (пока; до тех пор, пока) Тоже цикл, который выполняется до тех пор, пока условие в скобочках правильно.
sadik.firstChild - (скажет нам - есть ли еще в этом sadik-е firstChild - первый, или хотя бы один кто-то)
undefined -("не определено") такую ерунду пишет флэш, когда мы у него спрашиваем то, что ему неизвестно.
!= - означает дословно "НЕ РАВНО"

и так..

while (sadik.firstChild != undefined) - пока в садике еще кто-то есть
myTextField.text += sadik.firstChild.nodename - спрсить у первого встречного имя и записать его в текстовое поле
sadik.firstChild.removeNode(); - а затем убить его....

и тогда на место убитого первого НОДа встанет (если еще кто-то остался) новый и станет первым....
а когда никого не останется и флэш скажет:
- "sadik.firstChild"!
и никто не отзовется...
тогда флэш скажет мясорубке
- undefined
(здесь - ЯВОЛЬ! МАЙ Фюрер!)
мясорубка остановится...
Но нам останется только табличка с именами погибших НОДов.
Их посмертный список.

Что, в принципе и было угодно Богам, то есть в этой игре - нам.
В завершение пообещайте мне не трогать этих малышей и не запускать этот скрипт в тестовом режиме ;)=.


"глава 5"
ВТОРОЕ ПРИШЕСТВИЕ.
"... и увидел ОН, что грехи их множественны и уродливы
От одного одни войны
От другого обманы
От третьего тюрьмы и пытки
Да и четвертый на игру был нечист....
и нагнал на них всякой жути, и сказал,
- ЭЙ ВЫ НОДЫ-уроды, приносите пользу и будьте красивы и угодны матери природе!
.. и тогда стал Саша-вояка дубом вечным
.. Миша-лодырь-баскетболист стал сосной мачтовой
Оля стала, как ей и было положено - липой-липовой.
А Шамиль стал просто камнем да на полянке перед дубом...
И съежилось мрачное здание в клубок колючий, да вспыхнуло, и разлетевшись
превратилось в цветущий весенний лес. "

Знакомимся заново - НОДы - ДЕРЕВЬЯ!
Несмотря на весь этот театр кажущегося абсурда, здравый смысл тут все-таки присутствует.
Понять дальнейшую природу XML-нодов нам поможет именно МАТЬ-Природа.
Теперь каждый НОД у нас будет объявлен деревом, или, если нод является частью уже готового дерева,
то пусть он будет ветвью корявой.

ДА будет ЛЕС!

<LES></LES>

Посадим в лесу деревья и воткнем камушек на полянку

<LES>
<dub>
</dub>
<sosna>
</sosna>
<lipa>
</lipa>
<kamen/>
</LES>

Заглянем(просто заглянем) в этот ЛЕС.

<LES>
Теперь пусть у дуба вырастут веточки и у первой веточки пусть появятся листики,
а остальные пусть останутся голыми, и пусть у дуба будет дупло
<dub>
<vetochka1>
<listik1/>
<listik2/>
<listik3/>
</vetochka1>
<vetochka2/>
<duplo vduple="meda polno"/>
</dub>
У сосны пусть вырастет крона с иголками
<sosna>
<krona>
<igolka1/>
<igolka2/>
<igolka100/>
</krona>
</sosna>
У липы пусть набухнут почки на трех веточках
<lipa>
<vetochka1 pochka="4"/>
<vetochka2 pochka="10"/>
<vetochka3 pochka="2"/>
</lipa>
А с камнем пусть все будет как есть ;)=
<kamen oblom="....kakoi-to oblomok"/>
</LES>

--------------------------------------------------------------------------------------------
Запишем то, что получилось в файл "myxml.xml" и сохраним его в UNICODE-формате(ULTRAEDIT позволяет это легко)
для того, чтобы флэш нормально отображал русский язык... получим:
------------------------------ (copy-paste)-----------------------------------------------
<LES>
<dub>
<vetochka1>
<listik1/>
<listik2/>
<listik3/>
</vetochka1>
<vetochka2/>
<duplo vduple="meda polno"/>
</dub>
<sosna>
<krona>
<igolka1/>
<igolka2/>
<igolka100/>
</krona>
</sosna>
<lipa>
<vetochka1 pochka="4"/>
<vetochka2 pochka="10"/>
<vetochka3 pochka="0"/>
</lipa>
<kamen oblom="у него есть остаток какого-то хрена, наверно девки, что на речку бегали да поотломали для забавы"/>
</LES>
--------------------------------------------------------------------------------------------
А вы, друзья мои, теперь будете БОЙСКАУТЫ-Маугли, а я ваш Балу-Каа.
Осталось лишь научить вас по этим джунглям правильно передвигаться,
на ходу иногда записывая в свои ноут-тетрадочки нужную информацию.
Для общего развития:
К примеру теперь, чтобы добраться до
самого первого листика
самой первой веточки
первого дерева
надо написать

listik1 = myXML.firstChild.firstChild.firstChild.firstChild.nodeName;
myTextField.text=listik1;

О как длинно!
Поэтому пути лучше сокращать заранее и постепенно.
написав:
les = myXML.firstChild
мы получим путь к лесу

написав:
tree1 = les.firstChild
мы получим путь к нашему первому дереву

и дальше можно отталкиваться от него тем же способом
vetka1=tree1.firstChild
listik1 = vetka1.firstChild
listik1 = vetka1.firstChild.nodeName
myTextField.text=listik1;

и хотя увидим тоже самое, теперь можно не сбиваться в подсчетах одинаковых firstChild-ов;

Продолжим.
У нас уже есть готовый простенький загрузчик, вот им-то и воспользуемся снова.
примечание: код можно скопировать
///////////////////////////////////////////////////прямо начиная с этой строки////////////////////////////////////////////////////
myXML.onLoad = function(success)
{
if(success == true)
{
var les = myXML.firstChild; // объявим лес
// дальнейшее, все, что начинается с "myTextField.text= " можно открывать по очереди,
// закрывая остальные такие строки комментариями "//" - два слэша впереди строки
// иначе результат выведется только из последней открытой строки
myTextField.text= les.nodename; // - и увидим мы имя ЛЕСа;
//. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
// посчитаем - сколько в лесу у нас есть деревьев
myTextField.text=les.childNodes.length;
// только мы-то знаем, что четвертое-то вовсе не дерево... но это мелочь...
var tree1 = les.firstChild; // объявим первое дерево...
myTextField.text= tree1.nodename; // - так увидим мы первое дерево в ЛЕСу, его имя;
//. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
var tree2 = les.firstChild.childNodes[1];
myTextField.text= tree2.nodename; // - второе дерево
//. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
var tree3 = les.firstChild.childNodes[2]; // - объявим третье дерево
myTextField.text= tree3.nodename;
//. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
var kamen = les.lastChild; // - объявим последнее... камень.
myTextField.text= kamen.nodename ; // - и увидим имя последнего, что было в ЛЕСу;
// теперь возьмем и получим эти же имена, но сразу за один заход
for(i=0;i<les.childNodes.length;i++)
{
var name = les.childNodes[i].nodeName;
myTextField.text+=(name + "\n");
}
// получим в результате лесной список =)
// dub
// sosna
// lipa
// kamen
//. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

// так мы обошли весь лес и посчитали в нем все что там было
// на самом деле мы обошли только первый уровень вложености НОДа myXML (второго у него пока нет)
// и один уровень вложености НОДа LES но это лирика.
//. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
// в добавок познакомлю еще с одной возможностью перемещения по нодам
// NEXTSIBLING
// nextSibling - следующая ветка

sibling1 = tree1.firstChild; // - если это будет первая ветка в дереве1
sibling2 = sibling1.nextSibling; // то это будет следующая ветка после первой

myTextField.text = sibling2.nodeName; // - увидим имя этой ветки

// точно также можно вычислить третью ветку
sibling3 = sibling2.nextSibling;

myTextField.text = sibling3.nodeName;

// если мы возьмем за точку отсчета первое дерево
// то nextSibling-ом будет второе дерево.
tree2 = tree1.nextSibling;
myTextField.text = tree2.nodeName;
// получим сосну 1 шт. =)
// если мы возьмем за точку отсчета второе дерево
// то nextSibling-ом будет третье дерево.
myTextField.text = tree2.nextSibling.nodeName;
// получим липу
// практически с тем же результатом, но в обратном порядке можно использовать previousSibling
myTextField.text = tree2.previousSibling.nodeName
// получим предыдущее дерево - дуб и так далее.
//. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

// теперь в дополнение к знаниям можно пройтись по первому деревцу и заглянуть,
// что в нем есть. И узнать есть ли у него дети?(имеет ли оно вложеные НОДы) с помощью штуки:
// hasChildNodes();
// ВОТ ТАК:
myTextField.text = tree1.hasChildNodes();
// если ответ true - значит есть, если false - то нету детишек-то, обрубочек-с.
//..
// теперь давайте спросим у первой веточки - есть ли у нее дети? =) (имеет ли она вложеные НОДы)
vetocka1 = tree1.firstChild;
myTextField.text = vetocka1.hasChildNodes();
// тут тоже самое если ответ true - значит есть, если false - то нету детишек-то, обрубочек-с...
// добравшись до первой веточки и определив наличие вложеных в нее НОДов можно узнать
// у нее также количество вложеных в нее листиков воспользуемся условием IF - если.
if(vetocka1.hasChildNodes() == true)
{
for(var i=0;i<vetocka1.childNodes.length;i++)
{
myTextField.text += vetocka1.childNodes[i].nodeName;
}
}
// если они есть(если ответ 'true'), то получим их три штуки =)
// эту несложную операцию по обходу всех веток можно одинаково повторять со всеми
// НОДами.
// в завершение лесного инструктажа старый Балу покажет Маугли, как залезть в дупло дуба
// за сладким медом несколькими способами....

myTextField.text = myXML.firstChild.firstChild.lastChild.attributes.vduple // 1 способ - получим MEDA POLNO =)
myTextField.text = tree1.childNodes[2].attributes.vduple // 2 способ
myTextField.text = tree1.lastChild.attributes.vduple // - 3й
}
}
///////////////////////////////////////заканчивая этой строкой////////////////////////////////////////////////////////////////////////////////

Осталось задать домашнее задание.

1 получить список имен НОДов первого, второго и третьего дерева
2 получить из сосны имя каждой иголки
3 вывести в список количество почек для каждой ветки у липы в таком виде:
"Дерево: [имя дерева] ; ветка: [имя ветки]; количество почек: [количество]"
4 вывести на экран текст, содержащий:
"Имя последнего камня: [имя]; наличие вложеных нодов: [наличие]; "+"\n"+"и то, что осталось у него: [текст =)) ]"


"глава последняя"
НЕ УЧИ ОТЦА....И(ее).... БАСТА!
"................onXML.........................."


После некоторых раздумий я понял, что завершать начатое объяснение бедет логично
именно по тому же принципу, что и само объяснение =).
То есть - раз НОД открыл
Значит НОД надо закрыть.
Иначе ERROR.
Поэтому (аплодисменты)......

ONXML!

В XML есть очень полезная приблуда
И называется она

XMLSOCKET

Работает она также просто, как и просто XML (send-load)
Только разница в том, что принцип общения тут как в телефоне
(когда муж жене c работы звонит, чтобы узнать паспортные данные, а она
ему начинает нарезать задачи по вечернему моциону,
походу в магазин за прокладками и ... вобщем орать начинают обе стороны сразу и друг на друга).
Точно также и в сокете.
Если при LOAD-е клиент посылает запрос и получает ответ, то в СОКЕТЕ
одновременно могут разговаривать и клиент и сервер сразу, не дожидаясь ответа друг друга.
Потому, что открытый СОКЕТ - это постоянное двустороннее соединение.

Как открывается сокет:

mySocket = new XMLSocket() // создадим объ.... =) некое пространство для нового сокета
mySocket.connect("http://www.socket.com/xmlSocket.asp",2000); //пошлем запрос серверному скрипту на установление соединения
// в вашем случае у вас должен быть(надо найтиии =) ) такой скрипт для работы.

Теперь нужно обработать полученый ответ.
для этого в FLASH MX есть такая штука(метод объекта XMLSocket), как

onConnect

mySocket.onConnect - обрабатывает полученый ответ на запрос "connect"
Теперь можно написать условие, которое будет обрабатывать этот самый ответ
////////////////////////////////////////////////////////////////////////////////////////////////////
mySocket.onConnect = function(success)
{
if(success)
{
// СОЕДИНЕНИЕ УСТАНОВЛЕНО
// тут можно будет понаписать функций, которые будут срабатывать в случае удачного коннекта
}else
{
// СОЕДИНЕНИЕ УСТАНОВИТЬ НЕ УДАЛОСЬ
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
Если "success==true" значит соединение открылось и можно работать.
Необходимо добавить также условие, которое будет сигнализировать нам о том, что соединение вдруг закрылось
для этого в FLASH MX тоже есть штука(метод объекта XMLSocket):

onClose

mySocket.onClose - срабатывает в случае закрытии открытого соединения.
////////////////////////////////////////////////////////////////////////////////////////////////////
mySocket.onClose = function()
{
// СОЕДИНЕНИЕ РАЗОРВАНО
// тут можно будет понаписать функций, которые будут работать когда порвется коннект
}
////////////////////////////////////////////////////////////////////////////////////////////////////

И вот, наконец
САМ

ONXML

mySocket.onXML - эта такая штука, которая принимает то, что присылает нам сервер.
(то, что орет жена своему мужу по телефону)
А присылает сервер обычно точно такой же XML.

mySocket.onXML = function(myXML)
{
// myXML - это и будет точно такой же myXML, с которым мы уже умеем работать
// обычно это какой-то еденичный НОД с какими-то атрибутами, который можно обработать и все такое
if(myXML.firstChild.nodeName=="какое-то нужное нам имя")
{
node=myXML.firstChild
myText=node.attributes.attr1;
//ETC....................................
}
}
//. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

А чтобы послать какие-то данные серверу есть вещь

SEND

mySocket.send - именно та штука, которая посылает серверу сообщение
(в нашем примере это муж, который попопытался сказать одну-две фразы ;) )

message = "<my_message_for_servervife attribut1=\"а не пошла бы ты, дорогая... сама\" kuda=\"да в какой-нибудь магазин да подальше\"/>"

message - должен представлять из себя точно такой же ПРАВИЛЬНЫЙ (открыть-закрыть-НОД-не-забудь) XML-объект
который может состоять как из одного, так и из нескольких НОДов.
дальше его(message) надо послать серверу
это еще проще - всего одна строчка:

mySocket.send(message)

//. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

На этом я думаю оставить вас в размышлениях перед приоткрывшейся дверью
и удалиться снова вдаль.
Снова искать свой Икстлан и ловить духов.
За сим прощаюсь и откланиваюсь...
...И отходя от традиционного "вы ДОЛЖНЫ ПРОИЗНЕСТИ ВСЛУХ..." скажу, что....
...вслух вы можете орать что угодно и сколько угодно во след, или на улице
(хотя вряд ли вы осмелитесь - ("а вдруг, что люди подумают про... !!??"))

Как талисман для путешествия я оставляю вам свой зубастый улыбающийся смайлик:

;)=



Литература по FLASH