Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   парсинг xml :D (http://www.flasher.ru/forum/showthread.php?t=97765)

VoCz 28.06.2007 17:18

парсинг xml :D
 
Есть XML такого вида:
Код:

<?xml version="1.0" encoding="utf-8" ?>
<Config>
        <Head>Основной текст</Head>
<TableHeadline>

                        <Name>имя</Name>
                        <Info>инфо</Info>
</TableHeadline>
        <Objects>
                <Item>
                        <Name>имя1</Name>
                        <Info>инфо1</Info>
                </Item>
                <Item>
                        <Name>имя2</Name>
                        <Info>инфо2</Info>
                </Item>
        </Objects>
</Config>

Можете привести пример парсинга дочерних узлов. Прочитал только что статью Дембицкого, но на практике пока ничего не получилось, в поиске нашел примеры с братскими узлами и то кривовато оформленными, может я плохо ищу? :boredom:

iNils 28.06.2007 17:45

Парсинг ... что именно вы хотите?

VoCz 28.06.2007 17:46

получить все значения айтимов name и info во flash.

iNils 28.06.2007 18:01

Код:

var xml:XML = new XML ('<?xml version="1.0" encoding="utf-8" ?><Config>        <Head>Основной текст</Head><TableHeadline><Name>имя</Name><Info>инфо</Info></TableHeadline><Objects><Item><Name>имя1</Name><Info>инфо1</Info></Item><Item><Name>имя2</Name><Info>инфо2</Info></Item></Objects></Config>');
xml.ignoreWhite = true;
function parse (node:XMLNode) {
        var name:String = node.nodeName.toLowerCase ();
        if (name == "name" || name == "info") {
                trace (node.nodeName + ":" + node.firstChild.nodeValue);
        }
        if (node.hasChildNodes () || node.childNodes.length != 0) {
                var j:Number = 0;
                while (node.childNodes[j]) {
                        parse (node.childNodes[j++]);
                }
        }
}
parse (xml);


regman 11.01.2011 17:10

у меня уже голова кругом идет от этого парсинга. Нигде толком ниче не могу найти. Итого имеется загружаемый descr.xml:
Код:

<?xml version="1.0" encoding="unicode"?>
<gallery>
    <picture file="001_SummerCamp2006/P1010801.JPG" name="1"/>
    <picture file="001_SummerCamp2006/P1010804.JPG" name="2"/>
    <picture file="001_SummerCamp2006/P1010823.JPG" name="3"/>
    <picture file="001_SummerCamp2006/P1010860.JPG" name="4"/>
    <picture file="001_SummerCamp2006/P1010876.JPG" name="5"/>
</gallery>

мне нужно в поле Display динамического текста вывести name, тоесть описание файла. Если можно - короткий алгоритм всей этой процедуры вывода нужной информации, а то в голове просто не могу связать все воедино.
Начало такое:
Код AS1/AS2:

myXML = new XML();
myXML.ignoreWhite = true;
myXML.load("descr.xml");

Что конкретно делает функция parseXML если на пальцах разьяснить??

mooncar 11.01.2011 17:21

Вот вам решение для вашего конфига, если поля находятся на _root и именуются Display1, Display2 ... :
Код AS1/AS2:

var xmlData:XML = new XML();
xmlData.ignoreWhite = true;
xmlData.onLoad = loadXML;
xmlData.load('descr.xml');
 
function loadXML (success:Boolean)
{       
        if (success)
        {
                var node:XMLNode = this.firstChild ;
                var total:Number = node.childNodes.length ;       
                for( i = 0; i < total; i++)
                {
                        var fName:String = node.childNodes[i].attributes['name'];                       
                        trace(fName); //выведет 1, 2, 3, 4, 5
                        _root['Display' + i].text = fName;
                }
        }
}


regman 11.01.2011 17:31

Спасибо за пример. Вроде все понял. Только вот матчасть у меня хромает.

Вычитал насчет XML.onLoad() : К моменту вызова события onLoad полученные данные уже разобраны методом parseXML и помещены в тело экземпляра XML. Тоесть походу parseXML автоматом парсит файл?? Не нужно его вызывать потом нигде?? И в какой момент именно вызывается этот parseXML?? В момент вызова load?

И еще вопрос походу матчасти. Почему вызов функции loadXML идет раньше ее объявления??

Я просто пробую создать свою первую галерею на сайте без слайдшоу. Есть контейнер, с двумя кнопками (вперед, назад) и текстовое поле для вывода информации и фото (Display). Сейчас уже все работает, только не мог вывести описание файла.

mooncar 11.01.2011 17:41

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

А насчет метода parseXML - я им не пользуюсь, точно не скажу. Насколько я понимаю, метод предназначен для превращения строки в объект XML.

И еще. Вот цитата из переведенного хелпа по AS2:
Цитата:

XML.onLoad
...
Обработчик события; вызывается Flash Player, когда XML документ получен с сервера.

regman 11.01.2011 18:08

У меня стоит задача вывести описание файла name на изображение, загружаемое по пути file, взятому из загруженного файла xml при запуске флэша. А также при каждом переходе к следующей/предыдущей фотографии.

Завтра с утра со свежей головой попробую через ваш пример сделать требуемое...

mooncar 11.01.2011 18:13

Совет. Заносите при парсинге полученные данные в заранее объявленный массив (или массивы), чтобы потом можно из было оттуда брать при смене слайда.

regman 12.01.2011 10:43

Спасибо. С массивами работает все как надо, только при первой загрузке картинки в поле display отображается undefined. Никак не могу понять в каком порядке исполняется код?? Привык что сверху вниз, а тут не поймешь.

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

mooncar 12.01.2011 11:04

I. Насчет undefined. Видимо вам надо увязать момент отображения первой картинки с моментом загрузки и разбора конфига. То есть отображать слайд и когда конфиг уже распарсен и когда картинка уже загрузилась.
Я обычно пишу прелоадер, который загружает конфиг и все картинки (отрисовываю их в битмапу и кладу в массив). Конечно, сперва идет загрузка конфига, чтобы получить пути для загрузки картинок, потом гружу их с помощью MovieClipLoader.
Также этот прелоадер у меня обычно следит за загрузкой всей флешки.
Когда готово всё, перехожу к кадру с основным содержанием флешки.

II. Насчет кодировки. Вообще-то флеш работает с UTF-8.
Общие рекомендации для нормальной работы с кириллицей:

1. Сохраните XML в UTF-8.
Одной записи <?xml version="1.0" encoding="UTF-8"?> в начале файла будет недостаточно. Нужно именно сохранить файл в кодировке UTF-8. Т.е. выбрать utf-8 при сохранении из текстового редактора (я, например, использую Notepad++, хотя и обычный Notepad умеет это делать).

2. Для нормального отображения в текстовых полях кириллицы часто нужно бывает внедрить шрифт.
Как внедрять шрифт, на форуме неоднократно говорилось.

Чтобы проверить, что у вас за проблема, локализуйте ее.
Например, потрейсите внутри парсера (в данном случае парсером я называю разбор данных внутри обработчика onLoad) получаемые из файла данные. Если трейс показывает нормальный кириллический текст, а в поле он не отображается, или отображается неправильно, то проблема уже не в работе с XML, а в отображении кириллицы в поле, внедрение шрифта должно помочь.

Ни в коем случае не используйте назначение свойства System.useCodepage = true.

Если уж совсем будут проблемы, стучитесь.

regman 12.01.2011 11:19

Еще раз спасибо. Действительно, мой редактор плохо сохранял в кодировке UTF-8, хотя в опциях было выставлено. Проблема с кодировкой решена.

Насчет undefined - запихнул строку отображения первого описания в саму функцию loadXML. Только вот не совсем понимаю последовательности исполнения кода программы. Стояла эта строчка вне, то есть после функции loadXML - было undefined. Тоесть, получается что сначала инициализируются/объявляются все пользовательские функции в программе, а потом уж начинается исполнение кода сверху вниз?? Или как?? В других языках программирования все на порядок в этом плане понятнее.

Описание первой картинки подтягивается из первого элемента массива, который заполняется в теле функции loadXML.

mooncar 12.01.2011 11:44

regman, все просто! Вы поступили верно.
Дело в том, что код AS работает асинхронно. Флеш - это в первую очередь интернет-технология и нуждается в учете полной загрузки чего-либо, того же динамического контента.
Код AS будет исполняться сам по себе мгновенно, строка за строкой, невзирая на то, что что-то не успело загрузиться, если не принять мер. А вдруг скорость соединения с файлом 1 байт /с ? Тогда данные о подписях будут получены очень не скоро.
А код последовательно выполнится практически мгновенно. И что-то может окажется undefined.
Поэтому и введены обработчики событий. То есть все, что нуждается в данных из конфига, нужно начинать выполнять изнутри onLoad. Необязательно пихать туда весь код. А просто например, создать функцию инициализации, которую и вызывать изнутри onLoad, выполняя ею начальные действия. Ведь они-то хоть и начальные, но уже требуют загруженных данных.

Те же картинки нужно грузить с помощью MovieClipLoader (есть событие onLoadInit), данные из файлов - класс LoadVars (события onLoad или onData).
Это нужно для того, чтобы знать, когда можно приступать к действиям над загруженным контентом или использовать конфигурационные данные.
Так что и тут все понятно. :)

regman 12.01.2011 11:53

Спасибо. Теперь все более прозрачно :)


Часовой пояс GMT +4, время: 23:06.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.