|
Открываем Flash растягиваем окно Actions на весь экран, меняем цвет фона на светлосерый, а цвет текста на тёмно серый, чтобы легче было работать и начинаем.
Для начала я опишу xml файл с которым мы будем работать. Конечно бывают случаи, когда текст xml файла находится в одной из переменных внутри фильма, но тут работа с ним аналогичная.
////// XML ////////
///// INDEX.XML//////
<!-- Можно сразу же скопировать этот текст в блокнот, а потом переименовать сохранённый файл в index.xml -->
<?xml version="1.0" encoding="windows-1251"?>
<autor>
<name>Омар</name>
<nick>Omax</nick>
</autor>
<tutorial class='xml' level='medium'>
<file url='E:\Tutorials\XML.html'/>
</tutorial>
////// ///////
Теперь за работу. Для начала про объектную модель документа. Опишу вкратце: основное неудобство, это то, что приходится ждать некоторое время, пока документ будет разобран и превращён деревце, а то и в несколько деревьев. Термин дерево принято применять при рассмотре вложенных друг в друга частей, вот я его и применяю. Flash плеер разбивает xml файл на объекты, каждому объекту соответствует либр один тег, либо текст. Вот наглядный пример нашего деревца:
<autor>
<name>
Omap
<nick>
Omax
<tutorial>
class='xml'
level='medium'
<file>
url='E:\Tutorials\XML.html'
Здесь обозначены чёрным цветом объекты соответствующие тегам, светлосиним атрибуты тегов, красным цветом объекты соответствующие тексту между открывающим и закрывающими тегами.
Примечание:
под определение текста попадают также пробелы и переносы строки, поэтому для того, чтобы при разборе документа получилось такое деревце необходимо устранить все пробелы и переносы строки из документа, не совсем удобно, чуть позже я научу вас обходить эту проблему стороной.
Надеюсь стало немного понятней, не расстраивайтесь, если плохо усвоили, это всё придёт с опытом работы. Теперь немного о классах, упрощающих работу с xml. Это XML и XMLNode. Объекты класса XML служат контейнером, хранящим дерево XML, объекты класса XMLNode служат контейнерами для хранения любого из объектов дерева.
Примечание:
на самом деле имееется ввиду дерево DOM ( Объектной Модели Документа ), для простоты я использую сочетание дерево XML, после того, как вы освоите работу с XML советую забыть это словосочетание.
Объявляем эти объекты:
var index:XML= new XML(); // объект класса XML
var teg:XMLNode=new XMLNode(); // то же самое, только поправка на XMLNode.
/* Зачем вообще это здоровое объявление, когда можно обойтись index= new XML ()?
Для того, чтобы после того, как вы поставите точку после слова index появлялась подсказка, позволяющая не печатать всё слово метода или свойства до конца */
// дальше грузим xml документ из файла index.xml находящегося в той же папке
index.load('index.xml');
// чтобы не удалять все ненужные пробелы и переносы строки пишем следуещее:
index.ignoreWhite=true;
// остаётся только ждать пока документ будет разобран:
index.onLoad = function ()
{
razbor_xml (index);
};
// эту запись необходимо поместить ву самый конец скрипта, так как мы ещё не объявили функцию razbor_xml
// незабудте сохранить файл. Теперь весь листинг (код, скрипт) приведённый ниже будет располагаться внутри конструктора функции
function razbor_xml (xml)
{
}
Ну наконец начинаем извлекать информацию. Для начала напишем trace (xml), предварительно закоментировав строчку, игнорирующую пробелы и переносы. Нифига не получилось? или выходит что-то не совсем похожее на исходный xml документ? Проблема в буквах кирилицы. Для её устранения нужно в самое начало вписать следующую строку System.useCodepage = true; Она заставит плеер использовать родную кодировку системы. Ещё раз тестируем фильм. А вообще для исключения возможности работы с неправильным xml есть такое свойство как status. Не будет лишеим написать в самом начале функции следующие строки:
if (xml.status != 0)
{
trace ('XML документ содержит ошибку');
return;
}
Надеюсь появилась уверенность о том, что все делаем првильно?
На данный момент мы можем загружать xml данные из внешнего файла, обходить проблему с кодировкой, объявлять объекты классов XML и XMLNode, ждать разбора документа xml, ну и имеем представление о объектной модели документа. Чуть не забыл, ещё и трассировать документ :)
Тем пора познакомиться с массивом хранящим ссылки на объекты дервца XML. Следущее свойство childNodes содержит ссылку на этот массив. Пишем следуещее:
array=[];
array=xml.childNodes;
trace (array);
Выводит то же самое. Неужели вы посмете спросить: так в чём разница? Для тех, кто посмел спросить рекомендую нажать Ctrl+Shift+Enter, выбрать в окне дебагера рутовый уровень, ну и наконец выбрать вкладку Variables. Если вы внимательно изучите содержимое то поймёте её. Если нет, то закрывайте этот туториал, он явно не для вас, а вернее не для людей вашего уровня знаний, может через месяц изучения технологии FLash всё таки поймёте.
Я не советую вам составлять ещё массивы содержащие другие ссылки, хотя в дальнейшем это пригодится.
Двигаемся дальше. В случае если строение документа вам неизвестно, вам не позавидуешь :), шучу. Ну для начала нужно узнать есть ли у первого объекта подъобъекты. Метгод hasChildNodes (); идеально подходит. Он возвращает true если они всё таки есть и false если их нет. В принципе можно даже не обсуждать свойства объекта XML, все они прекрасно видны в дебагере я лишь покажу функцию, которая будет перечислять всё теги второго уровня xml документа. При желании её можно сделать рекурсивной. Итак строение вашей функции razbor_xml:
function razbor_xml (xml)
{
if (xml.status != 0)
{
trace ('XML документ содержит ошибку');
return;
}
array = [];
array = xml.childNodes;
for (var i = 0; i < array.length; i++)
{
if (array[i].hasChildNodes)
{
trace('"Вложенные теги тега '+array[i].nodeName)
for (var j = 0; j < array[i].childNodes.length; j++)
{
trace (array[i].childNodes[j]);
}
}
}
}
Тут вы заметили свойство nodeName, о его назначении можно понять из свойств первого элемента массива array, т.е. вы начинаете отладку вашего фильма и проверяете наличие свойств у первого элемента массива, там их немало, да и догадаться о их назначении несложно. Добравшись до текстового элемента можно заметить, что сам текст принадлежит лишь свойству nodeValue, дриге свойства равны null, следовательно именно так его и можно извлекать, через свойство nodeValue. Ну и про атрибуты не стоит забывать. С ними всё аналогично, просто нужно знать, что свойство attributes содержит ссылку на все атрибуты тега. В нашем случае:
p=index.childNodes[1].attributes['class'];
trace (p);
С извлечением информации вроде бы тоже разобрались, отлично. Но для полного счастья необходимо научиться и создавать xml файлы. Если вы уже задались вопросом, а зачем нужен объект класса XMLNode, то вы внимательный читатель, если же нет, то грош вам цена.
Теперь поставим перед собой задачу сгенерировать xml документ, несущий информацию уже о читателе этой статьи, а не о его авторе.
var teg:XMLNode = new XMLNode (); - знакомые строчки? теперь работать будем именно с этой переменной
var reader:XML = new XML ();
теперь о методе createElement ('Имя тега'). Это метод класса XML, поэтому не стоит его присваивать классу XMLNode, он создаёт объект (тег) с заданным именем.
teg=reader.createElement('reader');
trace (teg);
Объект создан, но не присоединён, а вернее не имеет связи с xml документом. Теперь присоединим тег к xml документу, для этого служит метод класса XMLNode appendChild (xmlnode):
reader.appendChild(teg);
В данном случае тег присоединяется как вагон к поезду, тоесть куда поближе, соблюдение порядка к сожалению не наблюдается. Он становится сразу за ведущим вагоном, значит он первый или корневой. Если вдруг вы нашли несоответствие, то я вас поздравлю, всем кто не просёк стоит его поискать. Ладно, мучать не буду, просто к этому классу он тоже применим. В дальнейшем при необходимости присоединить его в другое место цеплять нужно уже как положенно к тегам. Но в большинстве случаев порядок всё таки нужен. Для этого стоит использовать метод insertBefore (your_teg, before_teg). Более понятно будет если посмотреть на работу метода с такой стороны. У нас в один тег вложены два других, нужно, чтобы третий встал между ними, тоесть стал вторым, отодвинув соседа напрво. В методе родительского тега первым указываем тег, который потеснит другого, ну а вторым укажем тот тег, которого потесним. Ну если до сих пор до вас не дошло, то поясню: для того, чтобы наш вложенный тег сам стал родительским, то тут нужно использовать его метод appendChild ();
Осталось поработать с атрибутами. А они делаются так
teg.attributes.name_of_attribut="значение'.
Атрибут присвавается тегу teg.
Вроде бы всё, желаю удачи. Не забывайте оставлять коментарии к тутору, а лучше присылать их мне на omar.05[ПЁС]list.ru, можете даже попросить написать на другую тематику если понравилось. Желаю удачи в работе, и не забывайте это лишь отпраная точка для вашей деятельности, этих знаний вам хватит лишь на первых порах, но дальше думаю всё обойдётся без проблем.
|