Просмотр полной версии : как передать структуру XML в дочерний объект?
misha_yu
04.12.2009, 16:40
всем привет,
вопрос: как передать структуру XML в дочерний объект?
// Инициализация в родителе
var myChildObject = new myChildClass(myXMLTag);
// Конструктор объекта дочернего класса
public function myChildClass (XMLStructure:???){
var myXML:XML = new XML;
myXML.XMLStructure = "myString";
}
Какого типа должена быть XMLStructure ?
И возможно ли вообще таким образом передать структуру XML объекта?
Спасибо.
public function MyChildClass(xmlStructure:XML)
{
super();
var myXML:XML = xmlStructure.copy();
myXML.XMLStructure = "myString";
}
var myChildObject:MyChildClass = new MyChildClass(myXMLTag);
Классы - с прописной.
У функций должен быть возвращаемый тип.
У переменных должен быть тип.
Переменные и методы - со строчной.
Круглые скобки после вызова конструктора.
super() - первой строчкой в конструкторе.
misha_yu
05.12.2009, 11:56
большое спасибо,
пожалуйста поясните в каком виде должен передаваться myXMLTag.
так не получается:
var myChildObject:MyChildClass = new MyChildClass(MyXML.user.name)
что вставить в скобочки в родителе? Если структура например = MyXML.user.name ?
спасибо.
XMLList - это уже не XML, ето коллекция XMLей.
super() - первой строчкой в конструкторе.
Мне кажется, это верно не всегда. При расширении сторонних компонентов часто бывает нужным произвести некую инициализацию до вызова конструктора суперкласса...
Не-не, лучше так не делать... так можно и недозаполнение стека ? (stack underflow) получить или вообще попытаться прочитать из несущесвующего адреса в памяти, вобщем, лучше все делать по порядку - так надежнее. :)
misha_yu
05.12.2009, 20:18
дык... а как в родителе задать этот XMLList или XML в круглые скобочки :confused:
wvxvw, пожалуйста приведите пример для чайников для структуры MyXML.user.name.
Че то в хэлпине не найду ответа.
А тут как бы если вам нужно передать либо XML либо XMLList - то общий знаменатель у них Object... и ничего с этим не поделаешь...
В принципе, можно тип задать как MXMLList, но тогда, если нужно передать XML его прийдется конвертировать в XMLList.
public function MyClass(arg:XMLList)
{
super();
this._list = arg;
}
var list:XMLList = <a/> + <b/>;
var myClass:MyClass = new MyClass(list);
var xml:XML = <a/>;
myClass = new MyClass(XMLList(xml));
GFreemen
05.12.2009, 22:23
var myXML:XML=new XML(<hrenovXML bla="bla-bla-bla"></hrenovXML>);
var myClass=new MyClass(myXML);
public class MyClass {
public function MyClass(neujeliEtoXML_param:XML){
}
}
misha_yu
06.12.2009, 10:03
Дорогие товарищи, спасибо за ответы.
Но.... возможно я не правильно спросил или не понял ответов ... если так, прошу прощения :) ,
Дело в том что мой дочерний класс должен изменять некоторые значения тегов в основном XML-е. Какие именно задается в родителе. При этом не изменяя самой структуры основного XML.
Например myXML:
<authors>
<author1>Вася</author1>
<author2>Петя</author2>
</authors>
MyChildClass(XMLTag:???, Name:String){
myXML.XMLTag = Name;
}
var myChildObject_1 = new MyChildClass(autors.author1, "Вася") ;
var myChildObject_2= new MyChildClass(autors.author2, "Петя") ;
--------------------------------------------------------------------------------------
строка var myXML:XML = xmlStructure.copy(); полностью заменяет структуру исходного myXML на xmlStructure.
а строка myXML.XMLStructure = "myString"; потом просто добавляет к этой структуре таг под названием "XMLStructure".
Вот что у меня получилось :( ,
поможите :confused:
Оператор . (точка) примененный к объекту типа 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>
вот родитель:
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,"Новый Вася");
}
}
вот дочерний класс:
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);
}
}
-------------------------------------------------------------------------------
и вот что получается на trace ("04. mainXML = " + mainXML); :
myXML = <authors>
<author1>
<name>Вася</name>
</author1>
<author2>
<name>Петя</name>
</author2>
<myXMLStructure>Новый Вася</myXMLStructure>
</authors>
Вопрос: что мне написать в строчках в родительском классе
var childXML:XML = <author1><name></name></author1>;
childClassTestXML = new ChildClassTestXML(childXML,"Новый Вася"); чтобы достучаться до mainXML.author1.name ?
Сделал вроде как вы посоветовали, но пока добавился просто тег <myXMLStructure>Новый Вася</myXMLStructure>
че то лыжи не едут :wacko:
спасибо.
Я все равно не понимаю, что вы хотите сделать...
чтобы достучаться до mainXML.author1.name ?
<< нужно написать mainXML.author1.name ...
но, это как бы вполне очевидно, ну, только не понятно, что вы ожидаете от этого действия...
Давайте, лучше по-другому... напишите, какой результат вы хотите получить, потому что иначе вас абсолютно не понятно.
Если вы привыкли к какому-то другому подходу в работе с XML (PHP DOMDocument / Java SAX XMLReader / C# XmlReader и т.п) или что-то еще, то если вы об этом расскажете, то, наверное вас будет проще понять.
Просто сейчас не понятна задача...
misha_yu
06.12.2009, 22:31
Извините, что я непонятно изъясняюсь. Я "дизайнер взявшийся за программирование" :)), необходимо для быстрейшей реализации проекта.
Сформулирую по другому:
Измените пожалуйста функцию в родительском классе (весь код в моем предыдущем посте):
// После загрузки 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>
Это уже проще:
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
Да но в моем случае строка выполняющая это действие
xml.author1.name[0].setChildren("Новый Вася");
должна быть в дочернем объекте....
Это важно. На месте "Новый Вася" должно быть имя загружаемого на сервер файла, который будет считан только в объекте дочернего класса.
а вот какой что надо изменять xml.author1.name[0] или xml.author1.name[2] это задается в родителе.
т.е. грубо говоря так:
код в родителе:
var XMLStructure1 = xml.author1.name[0]
myChild(XMLStructure1);
var XMLStructure2 = xml.author1.name[1]
myChild(XMLStructure2);
и в дочернем
public function (myXMLStructure:XML){
myXMLStructure = "Вася";
}
спасибо за терпение.... :o
А какая разница? Вы же уже передали ссылку на XML дочернему объекту? XML - это сложный тип данных, поэтому передаетася по ссылке, если вы захотите наоборот, передать копию - есть метод copy().
misha_yu
06.12.2009, 23:39
да передал XML , но как мне сказать одному объекту чтобы он изменил xml.author1.name[0] а второму объекту чтобы он изменил xml.author1.name[1] и т.д.
задачу можно решить если передавать данные (имя загружаемого на сервер файла) из дочернего класса. Но это будет не красиво мне кажется, мутить лисенеры для функций в дочернем классе.
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
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.