Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Обработка xml файла (http://www.flasher.ru/forum/showthread.php?t=171923)

argoniummm 27.11.2011 19:27

Обработка xml файла
 
Код:

<data>
<category1>
<iteam1 name="name" data="data"><iteam1>
<iteam2 name="name" data="data"><iteam2>
</category1>
<category2>
<iteam1 name="name" data="data"><iteam1>
<iteam2 name="name" data="data"><iteam2>
</category2>
</data>

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

Aquahawk 27.11.2011 19:33

с таким вопросом вам, думаю, стоит пройти в раздел ваканси.

goodguy 27.11.2011 19:33

Зачем категории названы как category1, category2.. ?
Здесь как раз надо чтобы они все разывались просто category и проблем не будет

argoniummm 27.11.2011 19:41

Их название просто тоже нужно будет учесть.

Добавлено через 48 секунд
Или можно сделать другой формат xml (но какой я не знаю)

andrew911 27.11.2011 20:35

Код AS3:

<data>
<category name="name">
<item name="name" data="data"><item>
<item name="name" data="data"><item>
</category>
<category name="name">
<item name="name" data="data"><item>
<item name="name" data="data"><item>
</category>
</data>


silin 27.11.2011 20:37

Код AS3:

var data:XML =
<data>
        <category1>
                <iteam1 name="name" data="data"></iteam1>
                <iteam2 name="name" data="data"></iteam2>
        </category1>
        <category2>
                <iteam1 name="name" data="data"></iteam1>
                <iteam2 name="name" data="data"></iteam2>
        </category2>
</data>;
 
 
for each(var category:XML in data.*)
{
        trace( "category : " + category.name() );
        for each(var item:XML in category.*)
        {
                trace( "\titem : " + item.name());
 
        }
}


goodguy 27.11.2011 21:08

А откуда там возьмется category? Если там category1, category2 и т.д.

silin 27.11.2011 21:13

>> А откуда там возьмется category?
E4X, однако.. :)

argoniummm 27.11.2011 21:33

Обращение несуществующего свойства data.
Ошибка возникает :(

silin 27.11.2011 21:40

argoniummm, в твоем первом посте xml не валидный, если ты тестишь его, то вероятно из-за этого

argoniummm 27.11.2011 21:46

Да, его тестил. Вижу слеши забыл.

Добавлено через 6 минут
Error #2044: Необработанный ioError:. text=Error #2032: Ошибка потока. URL: file:///D|/calc.xml
Теперь возникла такая вот ошибка... Он не может загрузить хмл файл...

goodguy 27.11.2011 22:07

Цитата:

Сообщение от silin (Сообщение 1048556)
>> А откуда там возьмется category?
E4X, однако.. :)

Да это я тупанул ) не обратил внимание на название переменной просто :D

argoniummm 27.11.2011 22:11

Всё разобрался. И последний вопрос: я сделал заполнение 1 поля. А как теперь сделать при выборе его подгрузку данных соответствующих ему во 2?

silin 27.11.2011 22:29

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

argoniummm 27.11.2011 22:36

Не понял вообще... Можно пожалуйста более простым языком?

silin 27.11.2011 22:49

поле ( ну это же какой-то объект, верно) вполне может иметь свойство data:XML, в этом data и будем хранить соответствующие данные, для первого это
Код AS3:

<category1>
        <iteam1 name="name" data="data"></iteam1>
        <iteam2 name="name" data="data"></iteam2>
</category1>

для других, следующие..
т.е. при выборе поля не нужна никакая подгрузка, все данные уже 'на борту'

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

argoniummm 27.11.2011 23:11

А ты можешь пожалуйста помочь кодом? А то вообще попробовал и не выходит...

Wolsh 27.11.2011 23:22

Может это поможет...

silin 27.11.2011 23:26

Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.net.URLLoader;
        import flash.net.URLRequest;
 
 
        public class Main extends Sprite
        {
 
                public function Main():void
                {
 
                        var data:XML =
                                <data>
                                        <category1>
                                                <iteam1 name="name" data="data"></iteam1>
                                                <iteam2 name="name" data="data"></iteam2>
                                        </category1>
                                        <category2>
                                                <iteam1 name="name" data="data"></iteam1>
                                                <iteam2 name="name" data="data"></iteam2>
                                        </category2>
                                </data>;
 
                        var count:int = 0;
                        for each (var category:XML in data.*)
                        {
                                var field:Field = new Field(category);
                                field.y = 30 * count++;
                                addChild(field);
 
                        }
 
                }
 
        }
 
}
//////////////////////
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.text.TextField;
 
class Field extends Sprite
{
        private var data:XML;
        private var label:TextField = new TextField();
 
        public function Field(data:XML)
        {
                this.data = data;
                label.width = 60;
                label.height = 20;
                label.border = true;
                label.selectable = false;
                label.text = data.name();
                addChild(label);
                addEventListener(MouseEvent.CLICK, click);
        }
 
        private function click(e:MouseEvent):void
        {
 
                trace(this+" data : " + data.toXMLString());
        }
 
}


argoniummm 28.11.2011 00:00

И я всё равно ничего не понял...
Можешь пожалуйста сделать код для 1 класса?

silin 28.11.2011 01:08

для одного класса, только второй из вариантов

Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.MouseEvent;
        import flash.text.TextField;
 
        public class Main extends Sprite
        {
                private var data:XML =
                        <data>
                                <category1>
                                        <iteam1 name="name" data="data"></iteam1>
                                        <iteam2 name="name" data="data"></iteam2>
                                </category1>
                                <category2>
                                        <iteam1 name="name" data="data"></iteam1>
                                        <iteam2 name="name" data="data"></iteam2>
                                </category2>
                        </data>;
 
                public function Main():void
                {
 
                        var count:int = 0;
                        for each (var category:XML in data.*)
                        {
                                // создаем поля с имененм категорий
                                var field:TextField = createField(category.name().toString());
                                field.y = 30 * count++;
                                field.addEventListener(MouseEvent.CLICK, field_click);
                                addChild(field);
 
                        }
 
                }
 
                private function field_click(e:MouseEvent):void
                {
                        // выдергиваем данные из XMl по имени
                        var field:TextField = e.currentTarget as TextField;
                        var fieldData:XML = data.child(field.text)[0];
                        trace("fieldData : " + fieldData);
 
                }
 
                private function createField(str:String):TextField
                {
                        var res:TextField = new TextField();
                        res.width = 60;
                        res.height = 20;
                        res.border = true;
                        res.selectable = false;
                        res.text = str;
                        return res;
                }
 
        }
 
}


argoniummm 28.11.2011 08:24

А я ошибаюсь, или он заполняет только название категорий? (Просто я с этим разобрался). У меня то проблема с заполнением 2 категории в зависимости от 1.

silin 28.11.2011 09:00

>> А я ошибаюсь, или он заполняет только название категорий?
вопрос в пустоту..
у тебя есть XML, ты берешь из него то, что тебе нужно и заполняешь, то что нужно
почитай, пожалуйста, что-нибудь про XML, многие вопросы отпадут сами собой

argoniummm 28.11.2011 16:34

Я читал. Смотри: у меня на сцене находятся 2 выпадающих списка. 1 я заполнил (это название категории). В каждой названии категории есть n пунктов, которые мы загружаем из хмл. Вопрос собственно в том как заполнить 2 в зависимости от выбора 1?
Вот пример: http://www.vsejaluzi.ru/ (кнопка калькулятор)

silin 28.11.2011 17:09

>> Вопрос собственно в том как заполнить 2 в зависимости от выбора 1?
сори, но мы похоже на разных языках говорим
в моих последних двух примерах по клику на объектах, созданных из 'корневых' узлов хмл, трейс выводит xml, соответствующий внутренним xml этих узлов, заполняй ими что угодно..
вот честно не знаю, чем еще я могу помочь

argoniummm 28.11.2011 17:16

Странно, у меня ничего не выводило...


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

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