PDA

Просмотр полной версии : Класс для работы с xml


AlexSol
23.03.2007, 21:53
задача такая: разобрать xml-файл и сообщить, что разбор закончен. С разбором проблем нет, ну и сообщение о завершение разбора приходит. Вопрос в том, насколько грамотно сделано сообщение об окончание разбора - может как-то проще можно?

класс:
class xmlObj extends XML {
private var _url:String;
public var node1:Array;
public var node2:Array;
/////
private var dispatchEvent:Function;
public var addEventListener, removeEventListener:Function;
function xmlObj() {
node1 = new Array();
node2 = new Array();
this.ignoreWhite = true;
this.onLoad = function(success:Boolean) {
myparseXML(this);
};
////
EventDispatcher.initialize(this);
this.addEventListener('onParse', this);
dispatchEvent({type:'onParse'});
}
public function onParse() {
}
private function myparseXML(xml:XML) {
var node:XMLNode = xml.firstChild;
nodeToObject(node, node1);
var node:XMLNode = xml.firstChild.firstChild;
nodeToObject(node, node2);
dispatchEvent({type:'onParse'});
}
private function nodeToObject(node:XMLNode, obgect:Array) {
var attr;
for (attr in node.attributes) {
obgect[attr] = node.attributes[attr];
}
}
public function get getNode1():Array {
return node1;
}
}


вызов:
import xmlObj;
var myXML:xmlObj = new xmlObj();
myXML.load("http://www.testphp.ru/draw/reply.xml");
myXML.onParse = function() {
var arr:Array = this.getNode1;
trace(arr['status']);
};

файл xml
<?xml version="1.0" encoding="UTF-8"?><reply status="ok" mode="image"><image url="image_url"></image></reply>

etc
24.03.2007, 14:04
Классы так не называют. Имена должны начинаться с прописной буквы.

EventDispatcher у тебя не работает совсем, ибо он не импортирован даже.

Зачем подписывать самого себя?

Если уж на то пошло, то должно быть примерно так:

import mx.events.EventDispatcher;
class MyXML extends XML {
public var node1:Object;
public var node2:Object;
public var addEventListener:Function;
public var removeEventListener:Function;

private var dispatchEvent:Function;

public function MyXML() {
super();
EventDispatcher.initialize(this);
this.node1 = new Array();
this.node2 = new Array();
this.ignoreWhite = true;
}

private function onLoad(success:Boolean):Void {
if (success&&this.loaded&&!this.status) {
var node:XMLNode = this.firstChild;
nodeToObject(node, node1);
var node:XMLNode = this.firstChild.firstChild;
nodeToObject(node, node2);
dispatchEvent({type:'onParse'});
} else {
trace('XML load error')
}
}
private function nodeToObject(node:XMLNode, object:Object):Void {
for (var attr:String in node.attributes) {
object[attr] = node.attributes[attr];
}
}
}

import MyXML;
myXML = new MyXML();
myXML.load('test.xml');
onParse = function(event) {
trace((event.target==myXML)+','+event.type);
trace(myXML.node1.status);
}
myXML.addEventListener('onParse',this);

Не проверял, но работать должно.

AlexSol
24.03.2007, 15:51
спасибо, работает.
EventDispatcher отвалился когда скрипт сюда копировал.

как этот класс надо изменить, чтобы onParse стало событием этого класса? тоесть чтоб вызывалось
myXML.onParse = function() {} ?

etc
24.03.2007, 15:57
public var onParse:Function;
…
if (success&&this.loaded&&!this.status) {
var node:XMLNode = this.firstChild;
nodeToObject(node, node1);
var node:XMLNode = this.firstChild.firstChild;
nodeToObject(node, node2);
dispatchEvent({type:'onParse'});
onParse();
} else {
trace('XML load error')
}

Но не делают так в AS2, делают так, как я написал, т.е. подписываются на событие, а не делают присвоение новой функции.