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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 26.04.2009, 02:38
Mur4ik вне форума Посмотреть профиль Отправить личное сообщение для Mur4ik Найти все сообщения от Mur4ik
  № 1  
Ответить с цитированием
Mur4ik
ветеран форума

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
По умолчанию Как добавить узел в XML

Необходимо добавить узел с задаваемым именем и атрибутами в XML.
Подскажите, плиз, пару моментов...
НаписАл вот такое:
Код AS3:
public static function addChapter($xml:XML, $name:String, $attrib:Object = null):XML
{
	$xml.appendChild( <{$name}> </{$name}> );
 
	var tmpNode:XML = $xml[$name][$xml[$name].length() - 1];
 
	for (var prop:String in $attrib)
	{ 
		tmpNode.@[prop] = $attrib[prop];
	}
 
	return $xml;
}
все работает, но хотелось бы узнать, может есть способ по-проще или правильней?

И еще вопрос: как вставить этот узел в определенную позицию, например, именно 3-м или 12-м (учитывая что узлы с таким же именем уже существуют)?
__________________
trace("Остановите Землю, я сойду!!!");

Старый 26.04.2009, 03:53
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 2  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Код AS3:
function addChapter(xml:XML, name:String, attrib:Object = null):XML
{
	if(!isXMLName(name)) return <error/>;
	xml.appendChild(<{name} {attribsToString(attrib)}/>);
	return xml;
}
 
function attribsToString(obj:Object = null):String
{
	var ret:String = "";
	if (obj === null) return ret;
	if (obj is XML) 
	{
		for each(var node:XML in obj.@*)
		{
			ret += node.name() + "=\"" + node.toXMLString() + "\" ";
		}
		return ret;
	}
	for (var p:String in obj)
	{
		ret += p + "=\"" + obj[p] + "\" ";
	}
	return ret;
}
var foo:XML = <foo/>;
 
trace(addChapter(foo, "chapter", { bar: "1234" }).toXMLString());
trace(addChapter(foo, "chapter", <bar bar="4321"/>).toXMLString());
trace(addChapter(foo, "chapter").toXMLString());
trace(addChapter(foo, "@", <bar bar="4321"/>).toXMLString());
И не используйте $ не по назначению, он абсолютно для других целей предназначен.
Да, и еще не понятно, как поступать с примитивами в таком случае (типа Boolean / Number если их передать последним параметром).
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 26.04.2009 в 03:55.
Старый 26.04.2009, 04:35
Mur4ik вне форума Посмотреть профиль Отправить личное сообщение для Mur4ik Найти все сообщения от Mur4ik
  № 3  
Ответить с цитированием
Mur4ik
ветеран форума

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
Огромное спасибо. Вышло посложнее, но видимо правильней.

Все же непонятны пару моментов:
Цитата:
Сообщение от wvxvw Посмотреть сообщение
И не используйте $ не по назначению, он абсолютно для других целей предназначен.
Для каких? Недавно обсуждалось, но я так и не понял чем это плохо.

Цитата:
Сообщение от wvxvw Посмотреть сообщение
Да, и еще не понятно, как поступать с примитивами в таком случае (типа Boolean / Number если их передать последним параметром).
Тоже не понятно, что Вы имеете ввиду.

И как все же вставлять в нужную позицию нужный узел?
__________________
trace("Остановите Землю, я сойду!!!");


Последний раз редактировалось Mur4ik; 26.04.2009 в 04:39.
Старый 26.04.2009, 05:15
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 4  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
А какая позиция "нужная"? Не боюсь показаться пошлым
$ нужно ставить перед именем метода или геттера / сеттера (не свойства) в том случае если:
- вы оверрайдите метод супер-класса
- вы хотите оставить метод суперкласса доступным для дальнейших потомков этого класса.
Пример:
Код AS3:
public class Foo extends Sprite {
....
public override function get width():Number { return Infinity; }
public final function get $width():Number { return super.width; }
Дело в том, что последним параметром вы можете передать не [object Object] а Boolean например, в таком случае ничего не добавится - т.е. функция не выдаст исключения, но и ничего не произойдет. Вероятность того, что вам это будет нужно не большая, но если уж писать классы утилит, то лучше предусматривать заранее все возможные варианты, а не только те, которые нужны именно сейчас.
__________________
Hell is the possibility of sanity

Старый 26.04.2009, 05:48
Mur4ik вне форума Посмотреть профиль Отправить личное сообщение для Mur4ik Найти все сообщения от Mur4ik
  № 5  
Ответить с цитированием
Mur4ik
ветеран форума

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
Цитата:
Сообщение от wvxvw Посмотреть сообщение
А какая позиция "нужная"? Не боюсь показаться пошлым
Ну, например, есть у меня в XML 23 узла <clipart/>, а мне нужно добавить еще один именно 17-м, а не в самый конец. Или тот что есть последним, переместить на другую позицию, есть способ который это сделает?

С остальным понятно, обдумаю как время будет
__________________
trace("Остановите Землю, я сойду!!!");

Старый 26.04.2009, 06:07
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 6  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Код AS3:
var xml:XML = <foo><a/><b/><c/><d/><e/></foo>;
var boo:XML = <boo/>;
xml.insertChildAfter(xml.*[2], boo);
trace(xml.toXMLString());
__________________
Hell is the possibility of sanity

Старый 26.04.2009, 06:27
Mur4ik вне форума Посмотреть профиль Отправить личное сообщение для Mur4ik Найти все сообщения от Mur4ik
  № 7  
Ответить с цитированием
Mur4ik
ветеран форума

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
Не... ну эт понятно

Я вот как то так пытаюсь, в одной функции пока чет не складывается, пришлось отдельную сделать:
Код AS3:
// В довесок к Вашему вышеприведенному коду
function addChapterAt(xml:XML, name:String, pos:int, attrib:Object = null):XML
{
	if (!isXMLName(name)) return <error/>;
 
	var insertNode:* = <{name} {attribsToString(attrib)}/>
 
	//TODO: Добавить проверку на пределы pos
	if (xml[name][pos] != undefined)
	{
		insertNode += xml[name][pos].copy();
		xml[name][pos] = insertNode;
	}
	else
	{
		xml.appendChild(insertNode);
	}
 
	return xml;
}
Вот только с тИпами проблема, не очень люблю "*", но по другому компилятор ругается...
__________________
trace("Остановите Землю, я сойду!!!");


Последний раз редактировалось Mur4ik; 26.04.2009 в 06:37.
Старый 26.04.2009, 06:36
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 8  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
insertNode никогда не будет другого типа кроме XML зачем ему звездочка? =/
Если чесно, я не совсем понимаю назначение этой функции - зачем она нужна, когда есть штатная которая делает то же самое?
__________________
Hell is the possibility of sanity

Старый 26.04.2009, 06:48
Mur4ik вне форума Посмотреть профиль Отправить личное сообщение для Mur4ik Найти все сообщения от Mur4ik
  № 9  
Ответить с цитированием
Mur4ik
ветеран форума

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
Чтоб не создавать заранее какой то узел, а сделать все в одной функции: и нужный узел создать с требуемыми именем и атрибутами и на указанную позицию его разместить )

Код AS3:
function addChapterAt(xml:XML, name:String, pos:int, attrib:Object = null):XML
{
	if (!isXMLName(name)) return <error/>;
 
	var insertNode:* = <{name} {attribsToString(attrib)}/>
 
	if (xml[name] == undefined)
	{
		xml.appendChild(insertNode);
		return xml;
	}
 
	if (pos < 0) pos = 0;
	if (pos > xml[name].length() - 1) pos = xml[name].length() - 1;
 
	insertNode += xml[name][pos].copy();
	xml[name][pos] = insertNode;
 
	return xml;
}
__________________
trace("Остановите Землю, я сойду!!!");

Старый 26.04.2009, 15:17
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 10  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Код AS3:
function addChapterAt(xml:XML, name:String, pos:int, attrib:Object = null):XML
{
	if (!isXMLName(name)) return <error/>;
	var insertNode:XML = <{name} {attribsToString(attrib)}/>;
	if (!xml.*.length()) return xml.appendChild(insertNode);
	pos = pos < 0 ? 0 : pos;
	pos = pos > xml.*.length() - 1 ? xml.*.length() : pos;
	xml.insertChildBefore(xml.*[pos], insertNode);
	return xml;
}
 
function attribsToString(obj:Object = null):String
{
	var ret:String = "";
	if (obj === null) return ret;
	if (obj is XML) 
	{
		for each(var node:XML in obj.@*)
		{
			ret += node.name() + "=\"" + node.toXMLString() + "\" ";
		}
		return ret;
	}
	for (var p:String in obj)
	{
		ret += p + "=\"" + obj[p] + "\" ";
	}
	return ret;
}
var foo:XML = <foo/>;
 
trace(addChapterAt(foo, "chapter", 100, { bar: "1234" }).toXMLString());
trace(addChapterAt(foo, "chapter", -50, <bar bar="4321"/>).toXMLString());
trace(addChapterAt(foo, "chapter", 1).toXMLString());
trace(addChapterAt(foo, "@", 0, <bar bar="4321"/>).toXMLString());
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 26.04.2009 в 15:20.
Создать новую тему Ответ Часовой пояс GMT +4, время: 13:19.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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