Форум 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=164261)

argoniummm 15.08.2011 07:00

Ошибка сохранения данных из xml в массив
 
Код AS3:

{
import flash.events.MouseEvent;
import flash.display.MovieClip;
import flash.display.DisplayObject;
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLRequest;
public class App extends MovieClip
{
var myXML:XML;
var XML_URL:String = "http://vk-life.com/data.xml";
var myLoader:URLLoader = new URLLoader();
var img:Array = [];
var question:Array = [];
var answer:Array = [];
var answer_img:Array = [];
var position = 0;
 
public function App()
{
 myLoader.addEventListener(Event.COMPLETE, xmlLoaded);
 myLoader.load(new URLRequest(XML_URL));
 SetQuestion();
}
 
public function xmlLoaded(event:Event):void
{
 myXML = new XML(myLoader.data);
 for each (var element:XML in myXML.elements())
 {
  if (element.name() == "img")
  {
  for each (var imggg:XML in element.elements())
  {
    img.push(imggg.toString());
  }
  }
 
  if (element.name() == "question")
  {
  for each (var questionnn:XML in element.elements())
  {
    question.push(questionnn.toString);
  }
  }
 
  if (element.name() == "answer")
  {
  for each (var answerrr:XML in element.elements())
  {
    answer.push(answerrr.toString());
  }
  }
 
 
  if (element.name() == "answer_img")
  {
  for each (var answer_imggg:XML in element.elements())
  {
    answer_img.push(answer_imggg.toString());
  }
  }
 
 }
}
 
public function SetQuestion ()
{
 question_txt.text = answer[position];
}
 
}
 
}

Данные флеш получает но почему то не хочет сохранять их в массив (получение данных я проверял так:
Код AS3:

 if (element.name() == "question")
  {
  for each (var questionnn:XML in element.elements())
  {
    question.push(questionnn.toString);
    trace(question.push(questionnn.toString));
  }
  }


MrPoma 15.08.2011 07:22

Попробуйте сделать современно:
Код AS3:

myXML = new XML(myLoader.data);
var img_elements:XMLList = myXML..img;
for each (var img:XML in img_elements){
  img.push(img.toXMLString());
}

Возможно, это из-за того, что вы используете toString instead of toXMLString.

argoniummm 15.08.2011 07:27

Всё равно не работает. Кстати забыл, вот структура xml:
Код:

<data>
<img>
<img0>img0</img0>
<img1>img1</img1>
</img>
<question>
<question0>question0</question0>
<question1>question1</question1>
</question>
<answer>
<answer0>answer0</answer0>
<answer1>answer1</answer1>
</answer>
<answer_img>
<answer_img0>answer_img0</answer_img0>
<answer_img1>answer_img1</answer_img1>
</answer_img>
</data>


kackbip 15.08.2011 08:27

Зачем вам xml если вы не соблюдаете иерархию?
Код:

<items>
  <item id="0">
      <image><image>
      <question></question>
      <answer></answer>
      <answer_image></answer_image>
  </item>
  <item id="1">
      <image><image>
      <question></question>
      <answer></answer>
      <answer_image></answer_image>
  </item>
  <item id="2">
      <image><image>
      <question></question>
      <answer></answer>
      <answer_image></answer_image>
  </item>
</items>


argoniummm 15.08.2011 08:53

А в чём у меня ошибка то? Почему он получает данные но не сохранят их в массив?

kackbip 15.08.2011 09:49

1) Очень неудобочитаемый код из-за того что вы воспользовались неудобным инструментом для работы с xml.
Вот как лучше с xml работать:
http://help.adobe.com/ru_RU/ActionSc...0204-7e72.html
2) Названия переменных, которые ничего не говорят об их предназначении.
3) Как вы определили, что данные в массив не сохраняются? Я вижу, что вы проверили получение данных, а где вы проверили, есть ли данные в массиве? Должны строки записываться в массив. Похоже проблема где-то в другом месте.

silin 15.08.2011 11:36

questionnn.toString это совсем не то, что видимо ожидается
попробуй questionnn.toString()

Добавлено через 28 минут
да и присоединяюсь к высказавшимся,
Код AS3:

if (element.name() == "img")

выглядит диковато для E4X
вот так яснее будет, не?
Код AS3:

var element:String;
myXML = new XML(myLoader.data);
 
 
for each(element in myXML.img.*)
{
        img.push(element);
}
 
for each(element in myXML.question.*)
{
        question.push(element);
}
// и т.д.


argoniummm 15.08.2011 12:57

Хм... У меня появилась ещё 1 проблема:
Вот весь класс, да я знаю что многое написано не рационально.
Код AS3:

package 
{
        import flash.display.*;
        import flash.desktop.*;
        import flash.events.*;
        import flash.net.*;
        import flash.text.*;
        import flash.xml.*;
 
        public class App extends MovieClip
        {
                var myXML:XML;
                var XML_URL:String = "http://vk-life.com/data.xml";
                var myLoader:URLLoader = new URLLoader();
                var img:Array = [];
                var question:Array = [];
                var answer:Array = [];
                var answer_img:Array = [];
                var position:int = 0;
 
                var number:int = 0;
                var my_answer:Array = [];
 
                var x_centre = 566;
                var y_centre = 256;
                var size = 15;
 
                public function App()
                {
                        myLoader.addEventListener(Event.COMPLETE, xmlLoaded);
                        myLoader.load(new URLRequest(XML_URL));
                        SetQuestion();
                        //stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
                        exit_btn.addEventListener(MouseEvent.CLICK, Exit);
                }
 
                public function xmlLoaded(event:Event):void
                {
                        var element:String;
                        myXML = new XML(myLoader.data);
 
                        for each (element in myXML.img.*)
                        {
                                img.push(element);
                        }
 
                        for each (element in myXML.question.*)
                        {
                                question.push(element);
                        }
 
                        for each (element in myXML.answer.*)
                        {
                                answer.push(element);
                        }
 
                        for each (element in myXML.answer_img.*)
                        {
                                answer_img.push(element);
                        }
 
                }
 
                public function processXML()
                {
                        var image_question:MovieClip = new MovieClip();
                        var imageLoader = new Loader();
                        image_question.addChild(imageLoader);
                        imageHolder.mouseChildren = false;
                        imageLoader.x = 0;
                        imageLoader.y = 0;
                        imageLoader.load(new URLRequest(img[k]));
                        addChild(image_question);
 
                }
 
                public function SetQuestion()
                {
                        question_txt.text = answer[position];
                }
 
                public function Exit(event:Event):void
                {
                        // getURL("javascript: closeTaskWindow("")");
                }
 
 
                /* private function keyUpHandler(event:KeyboardEvent):void
                {
                        trace(event.keyCode);
 
                        if (event.keyCode == 65)
                        {
                                my_answer.push("ф");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 66)
                        {
                                my_answer.push("и");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 67)
                        {
                                my_answer.push("с");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 68)
                        {
                                my_answer.push("в");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 69)
                        {
                                my_answer.push("у");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 70)
                        {
                                my_answer.push("а");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 71)
                        {
                                my_answer.push("п");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 72)
                        {
                                my_answer.push("р");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 73)
                        {
                                my_answer.push("ш");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 74)
                        {
                                my_answer.push("о");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 75)
                        {
                                my_answer.push("л");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 76)
                        {
                                my_answer.push("д");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 77)
                        {
                                my_answer.push("ь");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 78)
                        {
                                my_answer.push("т");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 79)
                        {
                                my_answer.push("щ");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 80)
                        {
                                my_answer.push("з");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 81)
                        {
                                my_answer.push("й");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 82)
                        {
                                my_answer.push("к");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 83)
                        {
                                my_answer.push("ы");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 84)
                        {
                                my_answer.push("е");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 85)
                        {
                                my_answer.push("г");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 86)
                        {
                                my_answer.push("м");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 87)
                        {
                                my_answer.push("ц");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 88)
                        {
                                my_answer.push("ч");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 89)
                        {
                                my_answer.push("н");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 90)
                        {
                                my_answer.push("я");
                                number = number + 1;
 
                        }
                        if (event.keyCode == 186)
                        {
                                my_answer.push("ж");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 222)
                        {
                                my_answer.push("э");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 188)
                        {
                                my_answer.push("б");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 190)
                        {
                                my_answer.push("ю");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 219)
                        {
                                my_answer.push("х");
                                number = number + 1;
 
                        }
 
                        if (event.keyCode == 221)
                        {
                                my_answer.push("ъ");
                                number = number + 1;
 
                        }
                }
 
 
        }
 
}

Вот такие ошибки:
D:\загадки\App.as, строка 6 1152: Конфликт с наследуемым определением flash.events:EventDispatcher.toString в пространстве имен public.
ComponentShim (скомпилированный фрагмент), строка 1 5000: В класс "fl.core.ComponentShim" должен входить подкласс "flash.display.MovieClip", так как он связывается с символом такого же типа в библиотеке.
ComponentShim (скомпилированный фрагмент), строка 1 5000: В класс "fl.controls.Label" должен входить подкласс "flash.display.MovieClip", так как он связывается с символом такого же типа в библиотеке.
ComponentShim (скомпилированный фрагмент), строка 1 5000: В класс "fl.controls.TextArea" должен входить подкласс "flash.display.MovieClip", так как он связывается с символом такого же типа в библиотеке.
ComponentShim (скомпилированный фрагмент), строка 1 5000: В класс "fl.controls.TextInput" должен входить подкласс "flash.display.MovieClip", так как он связывается с символом такого же типа в библиотеке.
ComponentShim (скомпилированный фрагмент), строка 1 5000: В класс "fl.controls.UIScrollBar" должен входить подкласс "flash.display.MovieClip", так как он связывается с символом такого же типа в библиотеке.

silin 15.08.2011 13:35

конкретно помочь тут нечем
похоже, что источники этих ошибок из-за бардака с объектами\компонентами, которые положены на таймлайн вручную и для которых IDE, генерит свои объявления и т.п.
надо наводить порядок в fla, отключить automatically declare stage instances в настройкаах, объявить их явно в классе, тогда возможно станет понятнее

argoniummm 15.08.2011 13:55

Хм... Я не понимаю это... Можете помочь если я выложу исходники: Просто я сижу уже пару часов и не могу понять... http://***********/25196115

kackbip 15.08.2011 13:58

иногда приходится сидеть днями

silin 15.08.2011 14:34

сможем помочь, если сумеете выделить проблему в минимальный пример и выложите сюда
а дебажить чужой проект целиком вряд ли кому-то интересно

argoniummm 15.08.2011 16:17

Вобщем вот разобрался и немного изменил код:
Код AS1/AS2:

public function xmlLoaded(event:Event):void
                {
 
                        myXML = new XML(myLoader.data);
 
                        for each (var element:XML in myXML.*)
                        {
                                for each (var child:XML in element.*)
                                {
                                        if (element.name() == "img")
                                        {
                                                trace(child.*);
                                                img.push(child.*);
                                        }
                                }
                        }
 
                        for each (var element:XML in myXML.*)
                        {
                                for each (var child:XML in element.*)
                                {
                                        if (element.name() == "question")
                                        {
                                                trace(child.*);
                                                answer.push(child.*);
                                        }
                                }
                        }
 
                        for each (var element:XML in myXML.*)
                        {
                                for each (var child:XML in element.*)
                                {
                                        if (element.name() == "answer")
                                        {
                                                trace(child.*);
                                                answer_img.push(child.*);
                                        }
                                }
                        }
 
                        for each (var element:XML in myXML.*)
                        {
                                for each (var child:XML in element.*)
                                {
                                        if (element.name() == "answer_img")
                                        {
                                                trace(child.*);
                                                question.push(child.*);
                                        }
                                }
                        }
 
                        number=answer.length;
 
                }

Вообщем данные в массив записывает норм, но text_question.text = question[position]; пишет что он равен null, хотя трейс всё норм выводит...

kackbip 15.08.2011 16:59

такого не может быть. Одно трейсите а другое вставляете. Либо у вас text_question == null

argoniummm 15.08.2011 17:11

Ну вот самостоятельная частькода:

Код AS3:

package 
{
        import flash.display.*;
        import flash.desktop.*;
        import flash.events.*;
        import flash.net.*;
        import flash.text.*;
        import flash.xml.*;
 
        public class App extends MovieClip
        {
                var myXML:XML;
                var XML_URL:String = "http://vk-life.com/data.xml";
                var myLoader:URLLoader = new URLLoader();
                var img:Array = [];
                var question:Array = [];
                var answer:Array = [];
                var answer_img:Array = [];
                var position:int = 0;
 
                var number:int = 0;
                var my_answer:Array = [];
 
                var x_centre = 566;
                var y_centre = 256;
                var size = 15;
 
                public function App()
                {
                        myLoader.addEventListener(Event.COMPLETE, xmlLoaded);
                        myLoader.load(new URLRequest(XML_URL));
                        SetQuestion();
 
                }
 
                public function xmlLoaded(event:Event):void
                {
 
                        myXML = new XML(myLoader.data);
 
                        for each (var element:XML in myXML.*)
                        {
                                for each (var child:XML in element.*)
                                {
                                        if (element.name() == "img")
                                        {
                                                trace(child.*);
                                                img.push(child.*);
                                        }
                                }
                        }
 
                        for each (var element:XML in myXML.*)
                        {
                                for each (var child:XML in element.*)
                                {
                                        if (element.name() == "question")
                                        {
                                                trace(child.*);
                                                answer.push(child.*);
                                        }
                                }
                        }
 
                        for each (var element:XML in myXML.*)
                        {
                                for each (var child:XML in element.*)
                                {
                                        if (element.name() == "answer")
                                        {
                                                trace(child.*);
                                                answer_img.push(child.*);
                                        }
                                }
                        }
 
                        for each (var element:XML in myXML.*)
                        {
                                for each (var child:XML in element.*)
                                {
                                        if (element.name() == "answer_img")
                                        {
                                                trace(child.*);
                                                question.push(child.*);
                                        }
                                }
                        }
 
                        number=answer.length;
                      trace(question[position]);
 
                }
 
                public function SetQuestion()
                {
                        text_question.text = question[position];
                }
                }
 
        }
 
}

П.с. могут быть несколько ошибок со скобками т.к. редактировал код в браузере..

silin 15.08.2011 18:44

SetQuestion() вызывается до того как данные загрузились
а trace(question[position]) уже после загрузки
т.е. все нормально, как написал так и работает..

argoniummm 15.08.2011 19:38

Всё, разобрался. Спасибо. И у меня ещё 1 вопрос: как включить в компоненте Label поддержку html разметки (/n)

silin 15.08.2011 20:03

она по умолчанию включена
Код AS3:

label.htmlText = '<b>bold</b> normal';


argoniummm 15.08.2011 20:26

Хм... Странно почему тогда он у меня отображает так: http://vk-life.com/2.png
И ещё 1 вопрос -
Код AS3:

public function AddFrame():void
                {
                        for (k=0; k<number; k++)
                        {                       
                        pole_+"k".x = x1 - (number-k)*pr;
                        pole_ +"k".y = y1;
                        }
                }

Пишет: Нельзя выполнить присваивание неизвестной переменной.
pole_0 pole_1 и тд - символы на сцене. Если делать:
Код AS3:

pole_0.x = x1 - (number-k)*pr;
pole_ 0.y = y1;

- то всё работает нормально.

КорДум 15.08.2011 20:28

\n должно быть.

argoniummm 15.08.2011 20:33

Всё равно не работает перенос:
http://vk-life.com/3.png

И ещё 1 вопрос -

Код AS3:

public function AddFrame():void
                {
                        for (k=0; k<number; k++)
                        {                       
                        pole_+"k".x = x1 - (number-k)*pr;
                        pole_ +"k".y = y1;
                        }
                }

Пишет: Нельзя выполнить присваивание неизвестной переменной.
pole_0 pole_1 и тд - символы на сцене. Если делать:

Код AS3:

pole_0.x = x1 - (number-k)*pr;
pole_ 0.y = y1;

- то всё работает нормально.

КорДум 15.08.2011 20:48

Код AS3:

(this["pole_"+k] as DisplayObject).y


argoniummm 15.08.2011 20:53

Большое тебе спасибо, а как быть с html разметкой?
Также пробовал прописывать этот текст в hetmText вместо text но результат один и тот же.

Добавлено через 40 минут
И ещё возник такой вопрос: как установить размер шрифта в компоненте Label?

Добавлено через 1 час 5 минут
А также как задать ему цвет?

silin 15.08.2011 22:18

Код AS3:

var fmt:TextFormat = new TextFormat();
fmt.size = 20;
fmt.color = 0x0000FF;
label.setStyle("textFormat", fmt);

http://help.adobe.com/ru_RU/FlashPla...ols/Label.html

GBee 15.08.2011 22:25

Цитата:

Большое тебе спасибо, а как быть с html разметкой?
Также пробовал прописывать этот текст в hetmText вместо text но результат один и тот же
Вместо \n - <br>

argoniummm 15.08.2011 22:29

Код AS3:

var fmt:TextFormat = new TextFormat();
fmt.size = 50;
fmt.color = FF6600;
label.setStyle("text_question", fmt);

Правильно?

GBee 15.08.2011 22:32

нет

Код AS3:

var fmt:TextFormat = new TextFormat();
fmt.size = 50;
fmt.color = 0xFF6600;
label.setStyle("textFormat", fmt);


argoniummm 15.08.2011 22:49

А как тогда сделать чтобы применить это к Label с именем: text_question?

GBee 15.08.2011 23:06

Вы не поверите :о)
Код AS3:

text_question.setStyle("textFormat", fmt);



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

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