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

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

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

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
По умолчанию Обновить один XML по другому

Подозреваю, задачка пустяковая, но нет времени глубоко зарываться в документацию.

Есть два объекта XML (profile и update):

Код:
<profile>
  <user>Ivan</user>
  <userID>123123123123</userID>
  <level>2</level>
  <balance>1000</balance>
</profile>

<update>
  <level>3</level>
  <balance>1400</balance>
</update>
Нужно обновить profile по update таким образом, чтобы:

- все узлы в profile, присутствующие в update, обновились значениями из update
- все узлы в profile, отсутствующие в update, остались в прежнем виде

Т.е., итогом операции является объект XML вида


Код:
<profile>
  <user>Ivan</user>
  <userID>123123123123</userID>
  <level>3</level>
  <balance>1400</balance>
</profile>

Как проще сделать?

Старый 20.02.2013, 17:55
yasha005 вне форума Посмотреть профиль Отправить личное сообщение для yasha005 Найти все сообщения от yasha005
  № 2  
Ответить с цитированием
yasha005

Регистрация: Dec 2012
Сообщений: 100
если это с сервака прилетает (хотя думаю тут других вариантов и нет), тогда проще сразу с сервака засылать второе один раз чем два раза первое

Старый 20.02.2013, 17:59
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 3  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Объект profile живет в клиенте и там порядка трех десятков параметров.
С сервера прилетает update и в нем как правило по три-пять параметров, которые требуют обновления, а остальные не трогаются.
Как раз хочу уйти от перекидывания лишних параметров.

Старый 20.02.2013, 18:06
yasha005 вне форума Посмотреть профиль Отправить личное сообщение для yasha005 Найти все сообщения от yasha005
  № 4  
Ответить с цитированием
yasha005

Регистрация: Dec 2012
Сообщений: 100
Цитата:
Сообщение от mikhailk Посмотреть сообщение
Объект profile живет в клиенте и там порядка трех десятков параметров.
С сервера прилетает update и в нем как правило по три-пять параметров, которые требуют обновления, а остальные не трогаются.
Как раз хочу уйти от перекидывания лишних параметров.
тогда закидывайте оба листинга в объект типа xml, а затем создайте метод в котором будут заменяться одни значения (в одном объекте xml) на другие (из другого объекта xml)

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

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Так вопрос в методе и заключался. ))

Вот такое решение получилось

Код AS3:
		private function refreshXML(basicXML:XML, update:XML) : XML
		{
			for (var i:int = 0; i < basicXML.children().length(); i++) 
			{
				var basicNode:XML = XML(basicXML.children()[i]);
				for (var j:int = 0; j < update.children().length(); j++) 
				{
					var updateNode:XML = XML(update.children()[j]);
					if (basicNode.name() == updateNode.name())
					{
						basicXML.replace(basicNode.childIndex(),updateNode);
					}
				}
			}
			return basicXML;
		}
Решение рабочее, но может проще есть вариант?

Старый 20.02.2013, 18:32
yasha005 вне форума Посмотреть профиль Отправить личное сообщение для yasha005 Найти все сообщения от yasha005
  № 6  
Ответить с цитированием
yasha005

Регистрация: Dec 2012
Сообщений: 100
Условный оператор, который сравнивает имена xml-объектов тут явно лишний, т.к. возвращаемые объекты имён у них в любом случае будут разные, значит это условие никогда не выполнится, как следствие данные никогда не обновятся

Добавлено через 4 минуты
хотя нет, извините, всё правильно, я просто не обратил внимание на переменные, которые вы объявляете внутри цикла

Добавлено через 15 минут
Незнаю насколько это будет проще, но по некторым источникам цикл while в обратном порядке выполняется немного быстрее чем for прямом порядке, и ещё один момент: будет эффективнее если длину массива запросить единожды чем кажды раз. Хотя мне думается что это такие незначительные нюансы, которые не особо важны.

Например так:

Код AS3:
private function refreshXML(basicXML:XML, update:XML) : XML
		{
			var i:int = basicXML.children().length();
			var j:int;
			var basicNode:XML;
			var updateNode:XML;
			while (--i > -1) 
			{
				basicNode = XML(basicXML.children()[i]);
				j:int = update.children().length();
				while (--j > -1) 
				{
					updateNode = XML(update.children()[j]);
					if (basicNode.name() == updateNode.name())
					{
						basicXML.replace(basicNode.childIndex(),updateNode);
					}
				}
			}
			return basicXML;
		}

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

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Да, но это все равно перебором.

Старый 20.02.2013, 19:25
yasha005 вне форума Посмотреть профиль Отправить личное сообщение для yasha005 Найти все сообщения от yasha005
  № 8  
Ответить с цитированием
yasha005

Регистрация: Dec 2012
Сообщений: 100
Цитата:
Сообщение от mikhailk Посмотреть сообщение
Да, но это все равно перебором.
с массивами только так и можно

Старый 20.02.2013, 19:43
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 9  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Зачем перебирать свойства profile? Если имена нод уникальны:

Код AS3:
for (var i:int = 0; i < update.children().length(); i++) 
{
	var updateNode:XML = XML(update.children()[i]);	
	basicXML.replace(updateNode.name(),updateNode);
}
__________________
משיח לא בא
משיח גם לא מטלפן

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

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
да, действительно работает

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

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

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


 


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


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