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

wvxvw 06.12.2009 14:28

Оператор . (точка) примененный к объекту типа XML всегда даст врезультате XMLList - остальная часть вопроса мне не понятна...

misha_yu 06.12.2009 21:38

вот XML:
Код:

<?xml version="1.0" encoding="utf-8"?>
<authors >
  <author1 >
          <name>Вася</name>
  </author1>
  <author2>
          <name>Петя</name>
  </author2>
</authors>

вот родитель:
Код AS3:

public class TestXML extends MovieClip {
 
                var childClassTestXML:ChildClassTestXML;
 
                // переменные считывания XML
                public static var mainXML:XML;
                private var mainXMLRequest:URLRequest=new URLRequest("testXML.xml");
                private var mainXMLLoader:URLLoader = new URLLoader;
 
                // Конструктор ************************
                public function TestXML() {
                        loadMainXML();
                }
                // Функции
                // Загрузка данных с XML
                private function loadMainXML():void {
                        mainXMLLoader.load(mainXMLRequest);
                        mainXMLLoader.addEventListener(Event.COMPLETE, mainXMLLoaded);
                }
                // После загрузки XML
                private function mainXMLLoaded(e:Event) {
                        mainXML = new XML(mainXMLLoader.data);
                        var childXML:XML = <author1><name></name></author1>;
                        childClassTestXML = new ChildClassTestXML(childXML,"Новый Вася");
              }
        }

вот дочерний класс:
Код AS3:

public class ChildClassTestXML extends MovieClip {
 
                // Конструктор ************************
                public function ChildClassTestXML(xmlStructure:XML, myString:String) {
                        super();
                        var mainXML = TestXML.mainXML; //основной XML
                        var myXMLStructure:XML = xmlStructure.copy();
                        trace ("01. mainXML.XMLStructure = " + mainXML.myXMLStructure);// ничего нет, а надо добраться до "Вася"в mainXML.author1.name
                        mainXML.myXMLStructure = myString;
                        trace ("02. mainXML.author1.name = "+mainXML.author1.name) // Вася
                        trace ("03. mainXML.XMLStructure = " + mainXML.myXMLStructure);//Новый Вася
                        trace ("04. mainXML = " + mainXML);

}
}

-------------------------------------------------------------------------------
и вот что получается на
Код AS3:

trace ("04. mainXML = " + mainXML);

:

Код:

myXML = <authors>
  <author1>
    <name>Вася</name>
  </author1>
  <author2>
    <name>Петя</name>
  </author2>
  <myXMLStructure>Новый Вася</myXMLStructure>
</authors>

Вопрос: что мне написать в строчках в родительском классе
Код AS3:

var childXML:XML = <author1><name></name></author1>;
childClassTestXML = new ChildClassTestXML(childXML,"Новый Вася");

чтобы достучаться до mainXML.author1.name ?


Сделал вроде как вы посоветовали, но пока добавился просто тег <myXMLStructure>Новый Вася</myXMLStructure>

че то лыжи не едут :wacko:
спасибо.

wvxvw 06.12.2009 22:01

Я все равно не понимаю, что вы хотите сделать...

Цитата:

чтобы достучаться до mainXML.author1.name ?
<< нужно написать mainXML.author1.name ...
но, это как бы вполне очевидно, ну, только не понятно, что вы ожидаете от этого действия...

Давайте, лучше по-другому... напишите, какой результат вы хотите получить, потому что иначе вас абсолютно не понятно.
Если вы привыкли к какому-то другому подходу в работе с XML (PHP DOMDocument / Java SAX XMLReader / C# XmlReader и т.п) или что-то еще, то если вы об этом расскажете, то, наверное вас будет проще понять.

Просто сейчас не понятна задача...

misha_yu 06.12.2009 22:31

Извините, что я непонятно изъясняюсь. Я "дизайнер взявшийся за программирование" :)), необходимо для быстрейшей реализации проекта.
Сформулирую по другому:
Измените пожалуйста функцию в родительском классе (весь код в моем предыдущем посте):
Код AS3:

// После загрузки XML
private function mainXMLLoaded(e:Event) {
        mainXML = new XML(mainXMLLoader.data);
        var childXML:XML = <author1><name></name></author1>;
        //var childXML:XML = mainXML.author1.name; // так не работает!!!
        childClassTestXML = new ChildClassTestXML(childXML,"Новый Вася");
}

Так чтобы в XML
Код:

<?xml version="1.0" encoding="utf-8"?>
<authors >
  <author1 >
          <name>Вася</name>
  </author1>
  </authors>

изменился на
Код:

<?xml version="1.0" encoding="utf-8"?>
<authors >
  <author1 >
          <name>Новый Вася</name>
  </author1>
  </authors>


wvxvw 06.12.2009 22:41

Это уже проще:
Код AS3:

var xml:XML =
<authors>
        <author1>
                <name>Вася</name>
        </author1>
</authors>;
xml.author1.name[0].setChildren("Новый Вася");
trace(xml.toXMLString());
/*
<authors>
  <author1>
    <name>Новый Вася</name>
  </author1>
</authors>
*/


misha_yu 06.12.2009 23:19

Да но в моем случае строка выполняющая это действие
Код AS3:

xml.author1.name[0].setChildren("Новый Вася");

должна быть в дочернем объекте....

Это важно. На месте "Новый Вася" должно быть имя загружаемого на сервер файла, который будет считан только в объекте дочернего класса.

а вот какой что надо изменять xml.author1.name[0] или xml.author1.name[2] это задается в родителе.

т.е. грубо говоря так:
код в родителе:
Код AS3:

var XMLStructure1 = xml.author1.name[0]
myChild(XMLStructure1);
var XMLStructure2 = xml.author1.name[1]
myChild(XMLStructure2);

и в дочернем
Код AS3:

public function (myXMLStructure:XML){
myXMLStructure = "Вася";
}


спасибо за терпение.... :o

wvxvw 06.12.2009 23:31

А какая разница? Вы же уже передали ссылку на XML дочернему объекту? XML - это сложный тип данных, поэтому передаетася по ссылке, если вы захотите наоборот, передать копию - есть метод copy().

misha_yu 06.12.2009 23:39

да передал XML , но как мне сказать одному объекту чтобы он изменил xml.author1.name[0] а второму объекту чтобы он изменил xml.author1.name[1] и т.д.

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

wvxvw 06.12.2009 23:52

Код AS3:

var xml:XML =
<authors>
        <author1>
                <name>Вася</name>
        </author1>
</authors>;
 
this.foo(xml.author1.name[0], "Новый Вася");
function foo(node:XML, replaceWith:String):void
{
        node.setChildren(replaceWith);
}
 
trace(xml.toXMLString());
/*
<authors>
  <author1>
    <name>Новый Вася</name>
  </author1>
</authors>
*/

?

misha_yu 07.12.2009 09:18

Огромное спасибо..... фурычит :D


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

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