![]() |
|
||||||||||
|
|||||
|
Регистрация: Mar 2006
Адрес: Russia, Kazan
Сообщений: 31
|
Одна проблема исчезала (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 += "Произошла ошибка!";
}
};
<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> |
|
|||||
|
Квач
Регистрация: Sep 2006
Адрес: Украина, Киев
Сообщений: 1,526
|
Мой вам совет - избавляйтесь от строк вроде "data_xml.firstChild.childNodes[i].childNodes[0].attributes.label" Мало того, что они жёстко заданы в плане индексов, так в такой длинной строке ещё и запутаться - всего ничего. Сделайте парсер гибким, чтобы он позволял парсить XML даже с переставленными местами тэгами. Делается это просто вложенными циклами и проверками. И сокращайте в каждом вложенном цикле путь к своим данным.
|
|
|||||
|
Регистрация: Jul 2005
Сообщений: 34
|
Цитата:
как раз торкаюсь в xml-e и совсем не радуюсь, что приходится писать такие идиотские строки. в php с этим проблем как-то совсем нету.. можно какую-нить инфу на эту тему? |
|
|||||
|
Регистрация: Sep 2001
Сообщений: 3
|
Для начала можно бы было создать переменную и присвоить ей часть строки:
дальше будет уже так: Последний раз редактировалось Jay; 23.09.2006 в 03:16. |
|
|||||
|
Квач
Регистрация: 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> После парсинга 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> Текст парсера будет выглядеть так: // Просто переменные для гибкой настройки парсера
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();
}
}
Попытался код прокомментировать в ключевых точках. Лучше на него смотреть во Флеше или в каком-то продвинутом текстовом редакторе, ибо форумные тэги CODE не поддерживают синтаксическую раскраску. ^_^ Последний раз редактировалось Хемуль; 23.09.2006 в 04:23. |
|
|||||
|
Регистрация: Jul 2005
Сообщений: 34
|
Хемуль, пасип.. основную мысль понял..
сяду программить себе парсер.. з.ы. кстати, если кому вдруг понадобится, один лучших php-шных парсеров лежит тут: http://minixml.psychogenic.com только у него есть несколько недостатков, которые требуют напильника и ручек. если что - пишите, объясню что и где. |
![]() |
![]() |
Часовой пояс GMT +4, время: 13:27. |
|
|
« Предыдущая тема | Следующая тема » |
|
|