Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 18.01.2017, 00:26
0l3 вне форума Посмотреть профиль Отправить личное сообщение для 0l3 Найти все сообщения от 0l3
  № 11  
Ответить с цитированием
0l3
 
Аватар для 0l3

Регистрация: Oct 2015
Сообщений: 32
в последнюю. Последняя хоть тресни их несколько, но последняя - одна... с точки зрения всего xml-дерева. А xmlList пытается разбить это дерево на несколько групп и спросить меня, "а тебе в какой группе последнюю ноду найти"? а кто его просит это делать и задавать мне вопрос когда я этого не жду. И если XMLList явно не создавался, то и пускай бы себе тихонько сидел пока его не позовут.
Все это конечно от не досконально изученного материала манов, но о какой открытости и удобстве для новичка может идти речь, если такая простая задача как построение xml-дерева выполняется с такими боями.. =/ прям квест безумный.. и таких моментов в as3 сплошь и рядом.. как по джунглям ползешь..


Последний раз редактировалось 0l3; 18.01.2017 в 00:39.
Старый 18.01.2017, 00:29
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 12  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Пф, с чего бы именно в последнюю? Вы обращаетесь к тегу, которым обозначено несколько элементов, и хотите, чтобы возвращался последний? А это никого с толку ещё сильнее не собьёт?) А как же тогда обратиться не к последнему, если возвращаться всегда будет только последний?
К тому же, почему именно последнюю? У каждого разработчика цели разные, что, весь мир под вас должен подстроиться?)

Цитата:
и таких моментов в as3 сплошь и рядом.. как по джунглям ползешь.
Не могу не согласиться, но такое есть во всех языках. Не всегда ожидания оправдываются, и мнения о том, как должно быть реализовано у вас и разработчиков языка расходятся.
__________________
There is no thing in this world that is not simple.


Последний раз редактировалось ZackMercury; 18.01.2017 в 00:41.
Старый 18.01.2017, 00:50
0l3 вне форума Посмотреть профиль Отправить личное сообщение для 0l3 Найти все сообщения от 0l3
  № 13  
Ответить с цитированием
0l3
 
Аватар для 0l3

Регистрация: Oct 2015
Сообщений: 32
Цитата:
Сообщение от ZackMercury Посмотреть сообщение
Пф, с чего бы именно в последнюю? Вы обращаетесь к тегу, которым обозначено несколько элементов, и хотите, чтобы возвращался последний?
А как это понимать тогда
Цитата:
appendChild(child:Object):XML
Добавляет данный дочерний элемент в конце свойств объекта XML.
Я создал объект xml и пошагово начал добавлять в него ноды через appendChild() ожидая их появление в конце дерева.. пока дело не дошло до 2 уровня вложенности.. и ни один кукбук не написал как сделать это "правильно".. у всех примеры с одноуровневой структурой..=/

Старый 18.01.2017, 00:56
Nooob вне форума Посмотреть профиль Отправить личное сообщение для Nooob Найти все сообщения от Nooob
  № 14  
Ответить с цитированием
Nooob
 
Аватар для Nooob

Регистрация: Mar 2007
Сообщений: 319
можно еще вот так
Код AS3:
var xml:XML = <TEST/>;
xml.* += <lvl1/>;
xml.lvl1.* += <lvl2/>;
xml.lvl1.* += <lvl2/>;
xml.* += <lvl1 a="1"/>;
xml.lvl1[1].* += <lvl2/>;
xml.* += <lvl1 a="1"/>;
xml.lvl1[2].* += <lvl2/>;
но лучше так
Код AS3:
var xml:XML = <TEST/>;
xml.appendChild(<lvl1/>);
xml.lvl1.appendChild(<lvl2/>);
xml.lvl1.appendChild(<lvl2/>);
xml.appendChild(<lvl1 a="1"/>.appendChild(<lvl2/>));
xml.appendChild(<lvl1 a="2"/>.appendChild(<lvl2/>));

Старый 18.01.2017, 01:06
0l3 вне форума Посмотреть профиль Отправить личное сообщение для 0l3 Найти все сообщения от 0l3
  № 15  
Ответить с цитированием
0l3
 
Аватар для 0l3

Регистрация: Oct 2015
Сообщений: 32
Спасибо братцы за решения.. надеюсь допишу этот эпический проект.

Старый 18.01.2017, 08:58
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 16  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
А как это понимать тогда
Это объяснение того, что делает appendChild(). У Вас проблема не в appendChild(), а в том, у какого объекта Вы пытаетесь вызвать этот метод. Проблема с пониманием, что XML это не просто какой-то текст, для которого "добавить" означает "добавить после последней буквы". XML это многоуровневый объект, да еще с такой неочевидной возможностью, как одинаковые названия уровней. Ни в каких других объектах языка этого нет. Никто не может иметь два РАЗНЫХ свойства с одинаковым названием. XML может. Поэтому, если Вы в ноду <человек/> добавили две ноды <рука/> и теперь хотите к рукам добавить пальцы, Вам необходимо как-то конкретизировать, на какую именно руку. И здесь "Добавляет данный дочерний элемент в конце свойств объекта XML" означает, что палец будет добавлен в конце свойств (то есть — нод) руки. Не в конце "текста" всего XML, а в конце объекта XML <рука/>, потому что Вы вызываете метод appendChild() у объекта человек.рука
Код AS3:
человек.рука.appendChild(палец); // свойство палец будет добавлено в свойства руки
И вот, если рука у человека одна, то разночтений не возникает и обращение через оператор "точка" возвращает эту единственную руку, которая имеет тип XML и appendChild() вызывается у этой руки.
Но если рук две и больше, то человек.рука не может вернуть ссылку на конкретный объект "рука", и возвращает список всех рук, принадлежащих данному объекту "человек", в виде коллекции типа XMLList.
И вот теперь, чтобы вызвать appendChild(<палец/>) у какой-то конкретной "руки", Вам необходимо выбрать её из этого списка, указать на одну конкретную руку, "в конец свойств" которой и будет добавляться новый палец. "В конец свойств" здесь подразумевает, что если у этой руки уже есть какие-то свойства (ноды), то новое свойство окажется в конце этого списка, а не в начале, как в случае вызова метода prependChild(), только и всего. Надо только понимать, о списке свойств КАКОГО объекта идет речь. Под "объектом XML" в данной справке подразумевается тот, у которого вызывается метод appendChild(), а не весь XML-документ и не "та нода, которую я создал последней"
__________________
Reality.getBounds(this);

Старый 18.01.2017, 16:30
0l3 вне форума Посмотреть профиль Отправить личное сообщение для 0l3 Найти все сообщения от 0l3
  № 17  
Ответить с цитированием
0l3
 
Аватар для 0l3

Регистрация: Oct 2015
Сообщений: 32
Ок, две руки у человека это XMLList. 1 рука и ее пальцы это тоже XMLList. Значит структура XML-объекта "человек" будет выглядеть так?

Старый 18.01.2017, 21:35
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 18  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Структура объекта здесь не причем. К слову сказать, у XMLList нет никакой структуры, это линейный пронумерованный список ссылок на узлы XML. То есть, у XMLList не бывает вложенности или каких-то внутренних отношений элементов, а значит и структуры.
Ваш рисунок показывает, что именно вернет оператор "точка". То есть, человек.рука будет списком из двух элементов. А человек.рука[0] будет конкретным XML в самом начале этого списка.
Далее, человек.рука[0].палец будет списком пальцев на этой руке.
А человек.рука[0].палец[2] будет средним пальцем на этой руке.

Еще раз: XMLList не является частью объекта XML.
XML не содержит в себе никаких XMLList. Он содержит только ноды, которые сами по себе также являются самостоятельными XML.
XMLList это промежуточный формат данных, существующий только во время обработки XML. Это, если хотите, одномерный массив ссылок на отдельные ноды объекта XML. Закладки)) В нем находятся даже не ноды, а только ссылки на них. Иначе, если бы Вы изменили что-то в ноде, обратившись через XMLList, это изменение не затронуло бы "настоящую" ноду в XML. XMLList содержит не копии узлов XML, а только ссылки на узлы, принадлежащие объекту XML.
Всегда, когда Вы обращаетесь к свойству объекта XML через точку, Вы получаете XMLList. Это тип данных, который возвращает "точка" применительно к XML. Всегда!
Неочевидный нюанс только в том, что если в списке XMLList содержится только одна ссылка на ноду XML, то XMLList позволяет обращаться к себе так, будто он и есть эта нода XML, то есть плеер не выкинет ошибку несоответствия Типов.
__________________
Reality.getBounds(this);

Старый 18.01.2017, 22:26
0l3 вне форума Посмотреть профиль Отправить личное сообщение для 0l3 Найти все сообщения от 0l3
  № 19  
Ответить с цитированием
0l3
 
Аватар для 0l3

Регистрация: Oct 2015
Сообщений: 32
Спасибо. В моем случае понимание тонких материй придет только с практикой =) А где почитать про "у XMLList нет никакой структуры, это линейный пронумерованный список ссылок..".. может есть материал с описанием реализации класса XML в as3? Я имею ввиду не те барыжные буржуйские книжонки, в которых тема начинается с "для чего нужен XML", а возможно какие то техдоки?

Старый 18.01.2017, 23:52
Nooob вне форума Посмотреть профиль Отправить личное сообщение для Nooob Найти все сообщения от Nooob
  № 20  
Ответить с цитированием
Nooob
 
Аватар для Nooob

Регистрация: Mar 2007
Сообщений: 319
Еще если сложно разобраться с работой E4X, то есть аналогичная реализация с помощью методов, по которым можно узнать что они возвращают XML или XMLList
Код AS3:
var xml:XML = new XML("<TEST/>");
xml.appendChild(new XML("<lvl1/>"));
xml.child("lvl1").appendChild(new XML("<lvl2/>")); //xml.lvl1.appendChild(<lvl2/>)
xml.child("lvl1").appendChild(new XML("<lvl2/>"));
Но использование E4X предпочтительнее, потому что работает быстрее

Резюмирую все что нужно помнить:
XMLList это промежуточный временный объект, который создается при обращении к любым вложенным элементам XML (будь-то атрибут, другая нода или текстовое содержимое). Если XMLList содержит один элемент, то обращение к методам и свойствам будет таким же как будто обращение идет к методам и свойствам этого элемента пруф, это сделано для удобства чтоб не писать постоянно [0] в примитивных случаях например:
Код AS3:
var xml:XML = <xml><c><d>3</d></c></xml>;
xml.@a = "1";
xml.b = "2";
var a:String = xml.@a;
var b:String = xml.b;
var d:String = xml.c.d;
//эквивалентно
var xml:XML = <xml><c><d>3</d></c></xml>;
xml.@a[0] = "1";
xml.b[0] = "2";
var a:String = xml.@a[0];
var b:String = xml.b[0];
var d:String = xml.c[0].d[0];
Если идет обращение к несуществующему элементу, то создается пустой XMLList.
А если выполнить присвоение, то несуществующие элементы создадутся
Код AS3:
var xml:XML = <xml/>;
xml.c1.ch2.ch3.* = <a b="1"/>; //<xml><c1><ch2><ch3><a b="1"/></ch3></ch2></c1></xml>
Содержимое в виде текста также является элементом XMLList под 0 индексом
Код AS3:
var xml:XML = <xml>123</xml>;
xml.*[0] = 321; //<xml>321</xml>
В целом при обращении к API XML все возвращает XMLList в котором может быть XML,XMLList,String

Чтобы удостовериться что XMLList каждый раз создается и содержит ссылки (даже на parent) можно провести такой опыт:
Код AS3:
var xml:XML    = <xml><c><d></d></c></xml>;
var d1:XMLList = xml.c.d;
var d2:XMLList = xml.c.d;
trace(d1 === d2); //false
d1.appendChild(<a>1</a>);
trace(d2.toXMLString()); //<d><a>1</a></d>


Последний раз редактировалось Nooob; 19.01.2017 в 01:26.
Создать новую тему Ответ Часовой пояс GMT +4, время: 22:59.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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