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

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

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

Регистрация: Mar 2006
Адрес: Russia, Kazan
Сообщений: 31
По умолчанию Проблема с XML

Одна проблема исчезала (http://flasher.ru/forum/showthread.php?p=569821), но потребовалось расширить XML, и появилась новая...
Проблема с отображением дублированных мувиков
Код AS:
Код:
data_xml.onLoad = function(success) {
	if (success) {
		for (i = 0; i < this.firstChild.childNodes.length; i++) {
			rus_xml_length = this.firstChild.childNodes.length;
			out_txt.text += "Статус XML: " + data_xml.status + newline;
			//region_map.push(data_xml.firstChild.childNodes[i].attributes.map);
			region_number.push(data_xml.firstChild.childNodes[i].attributes.number);
			bank_type.push(data_xml.firstChild.childNodes[i].childNodes[0].attributes.type);
			bank_label.push(data_xml.firstChild.childNodes[i].childNodes[0].attributes.label);
			description.push(data_xml.firstChild.childNodes[i].childNodes[0].childNodes[0].childNodes[0].nodeValue);
			//
			//флаги:
			for (j = 0; j < this.firstChild.childNodes[i].childNodes.length; j++) {
				icons_x.push(data_xml.firstChild.childNodes[i].childNodes[j].attributes.x);
				icons_y.push(data_xml.firstChild.childNodes[i].childNodes[j].attributes.y);
				icons_type.push(data_xml.firstChild.childNodes[i].childNodes[j].attributes.type);
				icons_label.push(data_xml.firstChild.childNodes[i].childNodes[j].attributes.label);
			}
			for (j = 1; j < icons_x.length; j++) {
				trace(icons_label[j]);
				_root.flag_mc.duplicateMovieClip("ico_flag" + j + "R_mc", [_root.getNextHighestDepth()]);
				_root["ico_flag" + j + "R_mc"].gotoAndStop(icon_type[j]);
				_root["ico_flag" + j + "R_mc"].city_txt.html = true;
				_root["ico_flag" + j + "R_mc"].city_txt.htmlText = icon_label[j];
				this["ico_flag" + j + "R_mc"]._x = _root[region_number[i] + "_mc"]._x + icon_x[j];
				this["ico_flag" + j + "R_mc"]._y = _root[region_number[i] + "_mc"]._y + icon_y[j];
			}
			_root[region_number[i] + "_mc"]._alpha = 100;
			_root[region_number[i] + "_mc"].i = i;
			_root[region_number[i] + "_mc"].onRollOver = function() {
				_root[region_number[this.i] + "_mc"]._alpha = 70;
			};
			_root[region_number[i] + "_mc"].onRollOut = function() {
				_root[region_number[this.i] + "_mc"]._alpha = 100;
			};
			_root[region_number[i] + "_mc"].onDragOut = function() {
				_root[region_number[this.i] + "_mc"]._alpha = 100;
			};
			_root[region_number[i] + "_mc"].onRelease = function() {
				out2_txt.htmlText = description[this.i] + newline;
			};
			flag_mc.duplicateMovieClip("flag" + i + "R_mc", i);
			_root["flag" + i + "R_mc"].gotoAndStop(Number(bank_type[i]));
			_root["flag" + i + "R_mc"].city_txt.html = true;
			_root["flag" + i + "R_mc"].city_txt.htmlText = bank_label[i];
			_root["flag" + i + "R_mc"]._x = _root[region_number[i] + "_mc"]._x;
			_root["flag" + i + "R_mc"]._y = _root[region_number[i] + "_mc"]._y;
			//
		}
	} else {
		out_txt.text += "Произошла ошибка!";
	}
};
XML:
Код:
<objects>
	<region number="20">
		<bank type="1" label="Город (HTML)">
			<desc>Информация о Городе 1</desc>
		</bank>
 		<icon  x="3" y="3" type="1" label="Один"/>
		<icon  x="5" y="5" type="2" label="Два"/>
		<icon  x="7" y="5" type="1" label="Три"/>
		<icon  x="9" y="5" type="2" label="Четыре"/>
		<icon  x="11" y="5" type="1" label="Пять"/>
	</region>
</objects>
Мувики никак не хотят появляться на карте, хелп...

Старый 22.09.2006, 19:07
Хемуль вне форума Посмотреть профиль Отправить личное сообщение для Хемуль Найти все сообщения от Хемуль
  № 2  
Ответить с цитированием
Хемуль
Квач
 
Аватар для Хемуль

Регистрация: Sep 2006
Адрес: Украина, Киев
Сообщений: 1,526
Мой вам совет - избавляйтесь от строк вроде "data_xml.firstChild.childNodes[i].childNodes[0].attributes.label" Мало того, что они жёстко заданы в плане индексов, так в такой длинной строке ещё и запутаться - всего ничего. Сделайте парсер гибким, чтобы он позволял парсить XML даже с переставленными местами тэгами. Делается это просто вложенными циклами и проверками. И сокращайте в каждом вложенном цикле путь к своим данным.

Старый 23.09.2006, 02:37
sart вне форума Посмотреть профиль Отправить личное сообщение для sart Найти все сообщения от sart
  № 3  
Ответить с цитированием
sart

Регистрация: Jul 2005
Сообщений: 34
Цитата:
Сообщение от Хемуль
Мой вам совет - избавляйтесь от строк вроде "data_xml.firstChild.childNodes[i].childNodes[0].attributes.label" Мало того, что они жёстко заданы в плане индексов, так в такой длинной строке ещё и запутаться - всего ничего. Сделайте парсер гибким, чтобы он позволял парсить XML даже с переставленными местами тэгами. Делается это просто вложенными циклами и проверками. И сокращайте в каждом вложенном цикле путь к своим данным.
оо!! сам думаю - как это делать??
как раз торкаюсь в xml-e и совсем не радуюсь, что приходится писать такие идиотские строки. в php с этим проблем как-то совсем нету..
можно какую-нить инфу на эту тему?

Старый 23.09.2006, 03:00
Jay вне форума Посмотреть профиль Отправить личное сообщение для Jay Найти все сообщения от Jay
  № 4  
Ответить с цитированием
Jay

Регистрация: Sep 2001
Сообщений: 3
Для начала можно бы было создать переменную и присвоить ей часть строки:
Код:
aaa=data_xml.firstChild.childNodes[i];
дальше будет уже так:
Код:
aaa.childNodes[0].attributes.map
aaa.childNodes[0].attributes.type
aaa.childNodes[0].attributes.label
...


Последний раз редактировалось Jay; 23.09.2006 в 03:16.
Старый 23.09.2006, 04:07
Хемуль вне форума Посмотреть профиль Отправить личное сообщение для Хемуль Найти все сообщения от Хемуль
  № 5  
Ответить с цитированием
Хемуль
Квач
 
Аватар для Хемуль

Регистрация: Sep 2006
Адрес: Украина, Киев
Сообщений: 1,526
2 sart:
Товарищ Jay уже дал часть подсказки.
Как я писал выше, парсер следует строить в виде вложенных циклов.
Привожу пример... Допустим, у нас есть флешка, в которой есть текстовое поле. В это текстовое поле необходимо загрузить список кратких обзоров статей. Каждая статья в списке имеет: заголовок, краткий текст статьи, ссылку "More...", по которой осуществляется переход на страницу с полным текстом статьи.
XML, допустим, выглядит так:
Код:
<document>
	<papers>
		<section>
			<title>СТАТЬЯ1</title>
			<description>Текст статьи 1...</description>
			<url>http://mysite.com/paper1.html</url>   
		</section>
		<section>
			<title>СТАТЬЯ2</title>
			<description>Текст статьи 2...</description>
			<url>http://mysite.com/paper2.html</url>   
		</section>
		<section>
			<title>СТАТЬЯ3</title>
			<description>Текст статьи 3...</description>
			<url>http://mysite.com/paper3.html</url>   
		</section>
	</papers>
</document>
То есть, самый корневой узел называется document, после него идёт следующий уровень - узел papers. Между тэгами papers описываются элементы списка статей. Описание каждой статьи начинается и заканчивается тэгами section. Заголовок статьи, её краткий текст и ссылка на страницу с полным текстом статьи задаются в тэгах title, description и url соответственно... Можно конечно было сделать иначе, задавая url и title как атрибуты тэга section, но так лучше для примера.
После парсинга XML'а необходимо получить HTML-код, который будет записан в динамическое текстовое поле. Согласно представленному выше XML'ю HTML-код нужен, например, такой:
Код:
<h1>СТАТЬЯ1</h1>
Текст статьи 1...
<br>
<a href="http://mysite.com/paper1.html" target="_blank">More...</a>
<br><br>
<h1>СТАТЬЯ2</h1>
Текст статьи 2...
<br>
<a href="http://mysite.com/paper2.html" target="_blank">More...</a>
<br><br>
<h1>СТАТЬЯ3</h1>
Текст статьи 3...
<br>
<a href="http://mysite.com/paper3.html" target="_blank">More...</a>
<br><br>
Потом к текстовому полю можно применить CSS, но речь сейчас не об этом...
Текст парсера будет выглядеть так:
Код:
// Просто переменные для гибкой настройки парсера
var XML_PATH:String = "settings.xml";
var TOP_NODE_NAME:String = "document";
var PAPERS_NODE_NAME:String = "papers";
var RECORD_NODE_NAME:String = "section";
var TITLE_NODE_NAME:String = "title";
var TEXT_NODE_NAME:String = "description";
var URL_NODE_NAME:String = "url";
var LINK_CAPTION:String = "More...";

// Переменные для красоты ^_^
var RECORD_TITLE:Number = 0;
var RECORD_URL:Number = 1;
var RECORD_TEXT:Number = 2;

// Строка для хранения HTML-кода, построенного парсером по XML
var temporalString:String = "";
// Массив для хранения данных, полученных парсером из XML
var recordsArray:Array = Array();
// XML (удивительно, не правда ли? ^_^)
var myXML:XML = new XML();
System.useCodepage = true;
myXML.onLoad = XMLLoaded;
myXML.ignoreWhite = true;
myXML.load(XML_PATH);

function XMLLoaded(success:Boolean) {
	if (success) {
		var topNode:XMLNode = myXML.firstChild;
		// Является ли корневой узел узлом с именем document
		if (topNode.nodeName == TOP_NODE_NAME) {
			var secondLevel = topNode.childNodes;
			// Цикл прохода по элементам второго уровня. В нашем случае есть только один элемент второго уровня - papers
			for (var nodesIndex:Number = 0; nodesIndex < secondLevel.length; ++nodesIndex) {
				var secondLevelNode:XMLNode = secondLevel[nodesIndex];
				// Начало обработки узла papers и его дочерних узлов
				if (secondLevelNode.nodeName == PAPERS_NODE_NAME) {
					var records:Array = secondLevelNode.childNodes;
					var errorCode:Number = 0;
					var index:Number;
					// Цикл прохода по дочерним узлам узла papers
					for (index = 0; index < records.length; ++index) {
						var currentRecord:XMLNode = records[index];
						// Является ли текущий дочерний (для papers) узел узлом с именем section
						if (currentRecord.nodeName == RECORD_NODE_NAME) {
							// Создаём массив для хранения данных о текущей загружаемой статье
							var loadedRecord:Array = Array();
							// Цикл прохода по лочерним узлам (title, description, url) узла section
							for (var attributesCount:Number = 0; attributesCount < currentRecord.childNodes.length; ++attributesCount) {
								var currentAttribute:XMLNode = currentRecord.childNodes[attributesCount];
								// Если текущий узел является узлом с именем title
								if (currentAttribute.nodeName == TITLE_NODE_NAME)
									loadedRecord[RECORD_TITLE] = currentAttribute.childNodes[0].nodeValue.trim();
								// Если текущий узел является узлом с именем description
								if (currentAttribute.nodeName == TEXT_NODE_NAME)
									loadedRecord[RECORD_TEXT] = currentAttribute.childNodes[0].nodeValue.trim();
								// Если текущий узел является узлом с именем url
								if (currentAttribute.nodeName == URL_NODE_NAME)
									loadedRecord[RECORD_URL] = currentAttribute.childNodes[0].nodeValue.trim();									
							}
							// Добавляем данные о загруженной статье в общий массив статей
							recordsArray.push(loadedRecord);
						} else {
							trace("Error loading XML - bad " + index + " child node name: " + records[index].nodeName + " (need: " + RECORD_NODE_NAME + ")");					
							errorCode++;
						}
					}
					if (errorCode == 0) {
						// По полученным после парсинга данным формируем HTML-код
						for (index = 0; index < recordsArray.length; ++index) {
							temporalString += "<h1>" + recordsArray[index][RECORD_TITLE] + "</h1>";
							temporalString += recordsArray[index][RECORD_TEXT];
							if (recordsArray[index][RECORD_URL] != "" && LINK_CAPTION !="" && recordsArray[index][RECORD_URL] != undefined) {
								temporalString += "<br>";
								temporalString += "<a href=\"" + recordsArray[index][RECORD_URL] + "\" target=\"_blank\">" + LINK_CAPTION + "</a>";
							}
							temporalString += "<br><br>";
						}
						// Выводим HTML-код в динамическое ткстовое поле
						writeText();
					}
				}
			}
		} else {
			trace("Error loading XML - bad first child name: " + topNode.nodeName + " (need: " + TOP_NODE_NAME + ")");
		}
	} else {
		// Тут просто выводится сообщение об ошибке в динамическое текстовое поле, если XML не загрузился
		trace("Unable to load XML: " + XML_PATH + " (Check path to XML file!)");
		temporalString += "<h1>Unable to load XML: " + XML_PATH + " (Check path to XML file!)</h1>";
		writeText();
	}
}
Функция writeText, которая тут встречается, переносит значение переменной temporalString в динамическое текстовое поле и производит остальные необходимые действия (настройку скроллинга, применение CSS и т.п.) То есть, не стоит обращать на неё слишком много внимания, потому как вопрос был не о том.
Попытался код прокомментировать в ключевых точках. Лучше на него смотреть во Флеше или в каком-то продвинутом текстовом редакторе, ибо форумные тэги CODE не поддерживают синтаксическую раскраску. ^_^


Последний раз редактировалось Хемуль; 23.09.2006 в 04:23.
Старый 23.09.2006, 13:55
sart вне форума Посмотреть профиль Отправить личное сообщение для sart Найти все сообщения от sart
  № 6  
Ответить с цитированием
sart

Регистрация: Jul 2005
Сообщений: 34
Хемуль, пасип.. основную мысль понял..
сяду программить себе парсер..

з.ы. кстати, если кому вдруг понадобится, один лучших php-шных парсеров лежит тут: http://minixml.psychogenic.com только у него есть несколько недостатков, которые требуют напильника и ручек. если что - пишите, объясню что и где.

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

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

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


 


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


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