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

Вернуться   Форум Flasher.ru > Архив Flasher.ru > Flash > ActionScript

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 13.08.2004, 17:30
KidsKilla вне форума Посмотреть профиль Отправить личное сообщение для KidsKilla Посетить домашнюю страницу KidsKilla Найти все сообщения от KidsKilla
  № 1  
KidsKilla
.grin! wuz here
 
Аватар для KidsKilla

Регистрация: Aug 2004
Адрес: paradise city
Сообщений: 3,981
Отправить сообщение для KidsKilla с помощью ICQ
По умолчанию XML 2 Object

сделал я большим потом и кровью функцию:

function xml2Object(src) {
var xmlObject = {};
var xmlSrc = new XML();
xmlSrc.ignoreWhite = true;
xmlSrc.onLoad = function() {
xmlObject = parse(xmlSrc.firstChild.firstChild, xmlObject);
xmlObject._src = src;
if (xmlSrc.firstChild.nodeName != null) {
xmlObject._fcname = xmlSrc.firstChild.nodeName;
}
if (xmlSrc.firstChild.nodeValue != null) {
xmlObject._fcvalue = xmlSrc.firstChild.nodeValue;
}
if (xmlSrc.firstChild.attributes != null) {
xmlObject._fcattributes = new Array();
for (var i in xmlSrc.firstChild.attributes) {
xmlObject._fcattributes[i] = xmlSrc.firstChild.attributes[i];
//trace("!!!"+xmlObject._fcattributes[i]);
}
}
//trace(xmlSrc.firstChild.firstChild.nodeType)
};
xmlSrc.load(""+src);
return xmlObject;
}
function parse(foo, obj) {
var ind;
var nName = foo.nodeName.toLowerCase();
var nVal = foo.nodeValue.toLowerCase();
var nAttr = foo.attributes;
trace("<"+nName+">-<"+nVal+">-<"+nAttr["attr"]+">");
if (nName != null) {
if (obj[nName] != null) {
ind = obj[nName].length;
obj[nName] = obj[nName].concat({});
trace("<"+nName+">"+obj[nName].length)
} else {
ind = 0;
obj[nName] = [{}];
//trace("<"+nName+">"+obj[nName].length)
}
}
if (foo.nVal != null) {
obj[nName][ind]._value = nVal.toString();
//trace(obj[foo.nodeName][ind]._value);
}
obj[nName][ind]._attributes = [];
for (var klop in nAttr) {
obj[nName][ind]._attributes[klop] = nAttr[klop].toString();
//trace(obj[foo.nodeName][ind]._attributes[klop])
}
if (foo.firstChild != null) {
obj[nName][ind] = parse(foo.firstChild, obj[nName][ind]);
//trace("obj["+foo.nodeName+"]["+ind+"]")
}
if (foo.nextSibling != null) {
obj[nName][ind] = parse(foo.nextSibling, obj[nName][ind]);
}
return obj;
}
var folio = xml2Object("portfolio.xml");
if (folio != null) {
trace("_value = "+folio._fcattributes[df]);
}
_______________________
XML такой:

<fst df="dfgdfg">
<item attr="some kind of attribute" attr2="some kind of attribute #2">
<image attr2="It's workin, but badly..."/>
<image attr2="It's workin!!!"/>
<txt>dfbgdfg</txt>
</item>
<item attr="some kind of"><txt>1111</txt></item>
</fst>
_______________________

Но не работает - не увеличивает переменную ind.
Крови испорчено - море. помогите, плз.
исходник приаттачен.
Вложения
Тип файла: txt makexmlobject.rar.txt (4.8 Кб, 5 просмотров)
__________________
Breakcore them all!

Старый 13.08.2004, 18:33
fiot вне форума Посмотреть профиль Отправить личное сообщение для fiot Посетить домашнюю страницу fiot Найти все сообщения от fiot
  № 2  
fiot
 
Аватар для fiot

Регистрация: Nov 2001
Адрес: Kyiv
Сообщений: 158
Отправить сообщение для fiot с помощью ICQ
Код:
// Constructor
_global.XML_2_OBJECT = function(watchXML)
{
	this.$xml = this.$root=this.$parent=new Object();
	ASSetPropFlags(this, null, 1, 1);
	if (watchXML != undefined) {
		this._parse.apply(this, arguments);
	}
};
// load
XML_2_OBJECT.prototype.load = function()
{
	var loader = this._makeLoader(this);
	arguments[0] = this._makeURL(arguments[0]);
	loader.load.apply(loader, arguments);
};
// toString
XML_2_OBJECT.prototype.toString = function()
{
	return this.$xml.toString();
};
XML_2_OBJECT.prototype.getValue = function()
{
	return (this.$xml.firstChild.nodeType == 3 ? this.$xml.firstChild.nodeValue : undefined);
};
//return the nodeName
XML_2_OBJECT.prototype.getNodeName = function()
{
	return this.$xml.nodeName;
};
/*************************************************/
// Private
/*************************************************/
XML_2_OBJECT.prototype._parse = function(node, parent)
{
	this.$parent = parent;
	if (node instanceof XML) {
		this.$root = node;
		node = node.firstChild;
	} else {
		this.$root = this.$parent.$root;
	}
	this.$xml = node;
	this.attributes = node.attributes;
	if (node.nodeType == 1 and node.firstChild.nodeType != 3) {
		for (var childCounter = 0; childCounter<node.childNodes.length; childCounter++) {
			var tempName = node.childNodes[childCounter].nodeName;
			if (this[tempName] == undefined) {
				this[tempName] = new Array();
				this.length++
				ASSetPropFlags(this[tempName], null, 1, 1);
			
			
			}
			this[tempName].push(new XML_2_OBJECT(node.childNodes[childCounter], this));
		}
	}
};

// reParse
XML_2_OBJECT.prototype._reParse = function()
{
	this._cleanup();
	this._parse(this.$xml, this.$parent);
};
XML_2_OBJECT.prototype._cleanup = function()
{
	for (var found in this) {
		delete (this[found]);
	}
};
// make path
XML_2_OBJECT.prototype._makeURL = function(host)
{
	if (this._online()) {
		var nocache = (random(100000)+100000);
		if (_global.sessionID != undefined) {
			return host+"?sid="+_global.sessionID+"&nocache="+nocache;
		} else {
			return host+"?nocache="+nocache;
		}
	} else {
		return host;
	}
};
XML_2_OBJECT.prototype._online = function()
{
	return (_root._url.subStr(0, 7) == "http://");
};
XML_2_OBJECT.prototype._makeLoader = function(target)
{
	var loader = new XML();
	loader.ignoreWhite = true;
	loader.link = target;
	loader.onLoad = function(ok)
	{
		if (ok) {
			ASSetPropFlags(this.link, ["onLoad"], 1, 1);
			this.link._cleanup();
			ASSetPropFlags(this.link, ["onLoad"], 0, 1);
			this.link._parse(this);
			this.link.onLoad(true);
			var header = this.link.attributes;
			if (header.session != undefined) {
				switch (header.session) {
				case "timeout" :
				case "end" :
					if (_global.session != undefined) {
						delete (_global.session);
						_global.onSessionEnd(header);
					}
					break;
				default :
					_global.session = new Object();
					_global.session.id = header.session;
					_global.onSessionStart(header);
					break;
				}
			}
		} else {
			this.link.onLoad(false);
		}
	};
	return loader;
};
ASSetPropFlags(XML_2_OBJECT.prototype, null, 1, 1);
//******************************
menu = new XML_2_OBJECT();
menu.load("menu_en.xml");
menu.onLoad = function(ok)
{
	if (ok) {
		_root.test();
	} else {
		trace("error");
	}
};
__________________
file-> new-> F9 -> Ctrl+v/*code*/ ->ctrl+enter

Старый 13.08.2004, 18:44
Nox Noctis вне форума Посмотреть профиль Отправить личное сообщение для Nox Noctis Посетить домашнюю страницу Nox Noctis Найти все сообщения от Nox Noctis
  № 3  
Nox Noctis
don't panic!
 
Аватар для Nox Noctis

Регистрация: Aug 2001
Сообщений: 4,121
почему вы стремитесь к сложному взамен простого?
ЗАЧЕМ?
объясните, а...

2fiot
это всё канеш круто, только я не понимаю зачем оно :))
объясните? столько работы не может быть просто так...

2KidsKilla
можешь сформулировать задачу? по-моему это какой-то код-ради-кода. байт-шлак :)


Последний раз редактировалось Nox Noctis; 13.08.2004 в 18:47.
Старый 13.08.2004, 18:53
fiot вне форума Посмотреть профиль Отправить личное сообщение для fiot Посетить домашнюю страницу fiot Найти все сообщения от fiot
  № 4  
fiot
 
Аватар для fiot

Регистрация: Nov 2001
Адрес: Kyiv
Сообщений: 158
Отправить сообщение для fiot с помощью ICQ
Nox Noctis
очень хотелось иметь такую штуку как xml в object ...
создаёт такую штуку...
Код:
_level0.menu = [object #2, class 'XML_2_OBJECT'] {
    onLoad:[function 'onLoad'],
    attributes:[object #4] {},
    settings:[object #5, class 'Array'] [
      0:[object #6, class 'XML_2_OBJECT'] {
        attributes:[object #7] {},
        background:[object #8, class 'Array'] [
          0:[object #9, class 'XML_2_OBJECT'] {
            attributes:[object #10] {
              color:"#FF0000",
              src:"bg.jpg"
            }
          }
        ],
        length:8,
        spacing:[object #11, class 'Array'] [
          0:[object #12, class 'XML_2_OBJECT'] {
            attributes:[object #13] {
              value:"10px"
            }
          }
        ],
обрашение просто класс...
Код:
lang$ = "en";
trace(_root.menu.settings[0].background[0].attributes.color);
trace(_root.menu.items[0].item[0].attributes[lang$]);
trace(_root.menu.items[0].item.length);
ну а Вам конечно же решать ... пользоваться ей или писать свой парсер...
__________________
file-> new-> F9 -> Ctrl+v/*code*/ ->ctrl+enter

Старый 13.08.2004, 18:59
KidsKilla вне форума Посмотреть профиль Отправить личное сообщение для KidsKilla Посетить домашнюю страницу KidsKilla Найти все сообщения от KidsKilla
  № 5  
KidsKilla
.grin! wuz here
 
Аватар для KidsKilla

Регистрация: Aug 2004
Адрес: paradise city
Сообщений: 3,981
Отправить сообщение для KidsKilla с помощью ICQ
значтак:

делал я функцию для перевода xml в объект для последующего пользования.

на выходе должно получиться чето вроде:

var someVar = myObjectFromXml.tag[0].attributes["id"]

и в someVar окажется к примеру "четотам"
если в xml'е написано:

<firstTag>
<tag id="четотам" />
<tag id="четотам другое" />
</firstTag>

вооот...
можно, конечно, воспользоваться похожими но другими функциями но там на выходе как правило синтаксис хзкакой.
+хочу сам разобраться)
да и вообще раз начал...

это была предыстория. теперь по поводу моих соображений че там не то:
там не обновляется индекс (ind). значит ничего не работает. да и на выходе по-моему один выхлоп. кароче я запутался.
__________________
Breakcore them all!


Последний раз редактировалось KidsKilla; 13.08.2004 в 19:04.
Старый 13.08.2004, 19:22
KidsKilla вне форума Посмотреть профиль Отправить личное сообщение для KidsKilla Посетить домашнюю страницу KidsKilla Найти все сообщения от KidsKilla
  № 6  
KidsKilla
.grin! wuz here
 
Аватар для KidsKilla

Регистрация: Aug 2004
Адрес: paradise city
Сообщений: 3,981
Отправить сообщение для KidsKilla с помощью ICQ
2 fiot

слу, в принципе это то самое. ток есть несколько вопросов:
1)куда он сует nodeValue => как достать.
2)что он делает с регистром
3)если не сложно, то покажи, как добраться до след. вещей:
<firstTag>
<item id="Id" />
<txt>какой-то текст</txt>
какой-то другой текст
</firstTag>
а)"какой-то другой текст"
б)"какой-то текст"
в)"Id"

вродь все...
я потому и писал свой парсер, что документации по прочим - с гулькин нос...
__________________
Breakcore them all!

Старый 13.08.2004, 19:44
Nox Noctis вне форума Посмотреть профиль Отправить личное сообщение для Nox Noctis Посетить домашнюю страницу Nox Noctis Найти все сообщения от Nox Noctis
  № 7  
Nox Noctis
don't panic!
 
Аватар для Nox Noctis

Регистрация: Aug 2001
Сообщений: 4,121
то есть вы хотите готовую и понятную структуру ХМЛ при помощи офигенной функции перевести в такую же структуру класса Object?

в чем сверхзадача-то? :) надо сделать чтобы ко всем тегам ХМЛ можно было образаться по имени, да? не проще ли обращаться к хмлу через массивы childNodes?

ну ладно, хотите так хотите.

2fiot
идея понятна, но, имха, соотношение выделки и овчинки явно не в пользу последней :)

2KidsKilla
там бардак у тебя с рекурсией. и с тем что ты проверяешь фолио сразу после того как вызвал загрузку хмал, хотя это бредятина :)

и надо разнести загрузку и парсер.

вобщем всё переделать :)

Старый 13.08.2004, 19:56
fiot вне форума Посмотреть профиль Отправить личное сообщение для fiot Посетить домашнюю страницу fiot Найти все сообщения от fiot
  № 8  
fiot
 
Аватар для fiot

Регистрация: Nov 2001
Адрес: Kyiv
Сообщений: 158
Отправить сообщение для fiot с помощью ICQ
Код:
XML
<?xml version="1.0" encoding="UTF-8"?>
<firstTag>
	<txt>
			<item type="myText" name="text_name" text="BLLAAAA"/>
	</txt>
</firstTag>
Код:
 
test = new XML_2_OBJECT();
test.load("me.xml")
test.onLoad = function (ok){
	ok ? t() : trace('load =(')
	} 
t = function () 
{
	trace(test.txt[0].item[0].attributes.text)
}
ctrl+alt+v и смотришь иерархию
ЗЫ. первый тег игнорируется...

Nox Noctis
Цитата:
идея понятна, но, имха, соотношение выделки и овчинки явно не в пользу последней
да ладно тебе...
__________________
file-> new-> F9 -> Ctrl+v/*code*/ ->ctrl+enter

Старый 13.08.2004, 20:01
KidsKilla вне форума Посмотреть профиль Отправить личное сообщение для KidsKilla Посетить домашнюю страницу KidsKilla Найти все сообщения от KidsKilla
  № 9  
KidsKilla
.grin! wuz here
 
Аватар для KidsKilla

Регистрация: Aug 2004
Адрес: paradise city
Сообщений: 3,981
Отправить сообщение для KidsKilla с помощью ICQ
2 Nox Noctis
tanx, бум смотреть.

2 flot
пасиб, но с nodeValue то чего?
мне он ну ОООчень нужен. расписывать работы-то надо как то...
__________________
Breakcore them all!

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

Регистрация: Nov 2001
Адрес: Kyiv
Сообщений: 158
Отправить сообщение для fiot с помощью ICQ
Код:
XML_2_OBJECT.prototype.getValue = function()
{
return (this.$xml.firstChild.nodeType == 3 ? this.$xml.firstChild.nodeValue : undefined);
};
ну смоти же тут все напсано...
если тип ноды текс то вертуть валуе елсе не чего ...
ЗЫ. а зачем оно тебе сдесь ? у тебя ведь уже объект массив...
__________________
file-> new-> F9 -> Ctrl+v/*code*/ ->ctrl+enter

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

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

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


 


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


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