Foros del Web » Creando para Internet » Flash y Actionscript »

Ordenar XML

Estas en el tema de Ordenar XML en el foro de Flash y Actionscript en Foros del Web. Que tal foreros?? Tengo un XML el cual me gustaría hacer una función para ordenarlo (alfabeticamente, por fecha, etc). Por lo que he podido leer ...
  #1 (permalink)  
Antiguo 19/02/2007, 16:40
 
Fecha de Ingreso: mayo-2004
Mensajes: 21
Antigüedad: 13 años, 6 meses
Puntos: 0
Ordenar XML

Que tal foreros??
Tengo un XML el cual me gustaría hacer una función para ordenarlo (alfabeticamente, por fecha, etc). Por lo que he podido leer se que debo convertir el xml en un array para poder manejarlo mejor. Encontré un ejemplo que corre por ahí donde se ordenaba un XML que contiene unos datos de coches y se podían ordenar por "id", "marca", "velocidad". Hasta aquí bien, pero el problema es que los parámetros para ordenar son atributos de nodos y yo quedría ordenar el contenido de los nodos, no los atributos.
Les dejo un ejemplo del xml que quiero ordenar para a ver si así entienden lo que tan mal he explicado:

MI XML:
<trabajos>
<trabajo>
<titulo>Ejemplo 01</titulo>
<img>img/img01.jpg</img>
<publicado>09/02/07</publicado>
<categoria>web</categoria>
<descripcion>Este es el ejemplo uno.</descripcion>
<muestra>muestra01.jpg</muestra>
</trabajo>
</trabajos>

EJEMPLO ORDENAR COCHES:
<coches>
<coche id="1" marca="Seat" modelo="Léon" vMax="215" />
</coches>

Gracias y un saludo.
  #2 (permalink)  
Antiguo 19/02/2007, 17:32
Avatar de jahepi
Colaborador
 
Fecha de Ingreso: diciembre-2004
Ubicación: Querétaro
Mensajes: 1.124
Antigüedad: 13 años
Puntos: 43
Re: Ordenar XML

Hola et43!

Hay una extensión que hizo Senocular de la clase XMLNode para ordenar los nodos en un xml, antes que nada copia este código, te paso la liga directa de las librerías de Senocular Librerís de Senocular pero el código sale mal en algunos puntos como el [], sale así <>, pero bueno aquí te pego el código correcto:

Código:
// Removes and returns an XML node based on index
XMLNode.prototype.extractChild = function(i){
	var n = this.childNodes[i].cloneNode(true);
	this.childNodes[i].removeNode();
	return n;
}

// Swap the positions of two child nodes within their parent's childNodes array
XMLNode.prototype.swapChildren = function(i, i2){
	if (i==i2) return(0);
	if (i > i2){
		var temp = i;
		i = i2; i2 = temp;
	}
	var n = this.extractChild(i);
	var n2 = this.extractChild(i2-1);
	this.insertBefore(n2, this.childNodes[i]);
	this.insertBefore(n, this.childNodes[i2]);
}

// Sort child nodes based on a compare function (uses a simple quicksort)
XMLNode.prototype.sortChildren = function(cmp, low,high) {
	var a = this.childNodes;
	if (cmp == undefined) cmp = this.sortChildren.defaultCompare;
	if (low == undefined) low = 0;
	if (high == undefined) high = a.length;
	var p = a[low], w = low+1, h = high;
	while(w < h) {
		if (cmp(a[w], p)) w++;
		else this.swapChildren(w, (--h));
	}
	this.swapChildren(low, (--w));
	if (w-low > 1) this.sortChildren(cmp, low, w);
	if (high-h > 1) this.sortChildren(cmp, h, high);
}
 
// A default sort function for use in sortChildren
XMLNode.prototype.sortChildren.defaultCompare = function(a,b){
	return a.nodeName <= b.nodeName;
}
Pega ese código en tu primer fotograma de la aplicación, ahorita viene lo interesante, para ordenar por títulos de acuerdo a tu xml, este es un ejemplo de como debes utilizarla:

Código:
var xml:XML = new XML();
xml.ignoreWhite = true;
xml.load("trabajos.xml");
xml.onLoad = function(success:Boolean):Void {
	if(success) {
	    this.firstChild.sortChildren(compareByTitle);
	    trace(this);
	}
};

function compareByTitle(a, b):Boolean {
	return a.childNodes[0].firstChild.nodeValue <= b.childNodes[0].firstChild.nodeValue;
}
Lo que me interesa comentarte es la función compareByTitle, si te fijas puse esto "a.childNodes[0].firstChild.nodeValue", eso equivale al valor que tienes en el nodo titulo, si tu quieres comparar el nodo "img" este equivale al nodo 1, entonces haría otra función de esta forma:

Código:
function compareByImage(a, b):Boolean {
	return a.childNodes[1].firstChild.nodeValue <= b.childNodes[1].firstChild.nodeValue;
}
Para aplicar esa comparación solo le pasas la referencia de la función como lo hice en el ejemplo anterior: "this.firstChild.sortChildren(compareByTitle)" .

Sale, cualquier pregunta aqui tamos XD

Saludos !
  #3 (permalink)  
Antiguo 20/02/2007, 04:08
 
Fecha de Ingreso: mayo-2004
Mensajes: 21
Antigüedad: 13 años, 6 meses
Puntos: 0
Re: Ordenar XML

Ostras!!!! Gracias jahepi voy a probarlo.
Saludos!!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:48.