Error de lectura de XML con Flash
Hola!!!
Tengo un problema, estoy haciendo con flash una pagina con noticias. Estas noticias están almacenadas en un xml. El xml es el siguiente:
<code><noticia>
<titulo>Feria Wile Dusseldort</titulo>
<fecha>29.3 - 2.4 2006</fecha>
<image>feria01.jpg</image>
<logo>logo01.jpg</logo>
</noticia></code>
Y el swf lee el xml así:
<code>System.useCodepage = true;
var indice:Number;
var ferias:XML;
function cargarDatos(_indice:Number) {
var fecha:String;
var titulo:String;
var imagen:String;
var logo:String;
fecha_txt.text = noticias_xml.firstChild.childNodes[_indice].attributes.fecha;
titulo_txt.text = ferias.firstChild.childNodes[_indice].firstChild.firstChild.nodeValue;
fecha_txt.text = ferias.firstChild.childNodes[_indice].firstChild.nextSibling.firstChild.nodeValue;
imagen = ferias.firstChild.childNodes[_indice].firstChild.nextSibling.firstChild.nodeValue;
logo = ferias.firstChild.childNodes[_indice].lastChild.firstChild.nodeValue;
_root.imag_noticia.loadMovie(imagen);
_root.imag_logo.loadMovie(logo);
}
indice = 0;
ferias = new XML();
ferias.ignoreWhite = true;
ferias.load("../noticias/ferias.xml");
noticias.xml
ferias.onLoad = function() {
cargarDatos(indice);
};
</code>
Lo que ocurre es que no me lee la primera imagen, me da error en la linea de lectura de imagen, me lee la linea anterior. Por que puede ser??
Un saludo y gracias
elSuricatoRojo
Lo que se suele hacer es tener utilizar la función attachMovie() (que realmente es una método de la clase MovieClip). Con attachMovie puedes crear instancias de simbolos de la bilioteca a los que previamente hayas dado un identificador en las propiedades de vinculación.
La idea es aprovechar el for que te ponia antes, y hacer un attachMovie de un simbolo de bibliteca tipo movieclip que actue como "plantilla".
Un ejemplo:
<fieldset>
for (var i=0; i<dataNoticias.arrayNoticias.length; i++){
var noticiaId:String=dataNoticias.arrayNoticias[i]
var titulo:String=dataNoticias[noticiaId].titulo
var fecha:String=dataNoticias[noticiaId].fecha
var image:String=dataNoticias[noticiaId].image
var logo:String=dataNoticias[noticiaId].logo
// --
var altoNoticia:Number=20
var mc:MovieClip=this.attachMovie("ID_IDENTIFICADOR", noticiaId, this.getNextHighestDepth())
mc._y=altoNoticia*i
mc.titulo=titulo
mc.fecha=fecha
mc.image=image
mc.logo=logo
// En este punto se creado una instancia del simbolo con vinculación "ID_IDENTIFICADOR" (cambiarlo por uno mas apropiado), y se ha creado ya con los parametros titulo, fecha, etc de la noticia asociada
// El script odena en una columna las noticias asumiendo que tienen un alto de 20px (Es un ejemplo de como puedes utilizar el mismo for para posicionarlas ya que por defecto las instancias se crean en el 0,0)
}
</fieldset>
Si ves que te pierdes repasa en Google o en Ayuda: attachMovie.
No creo que pueda ayudarte de forma mas concreta pero por ahí van los tiros.
vega_vega
Ahora tengo otro problema:
La cosa es que yo no quiero tener 50 campos de texto por ai acaso para rellenar las noticias que tengo en el xml, porque en realidad no voy a saber cuantas tengo, entonces lo que yo digo es que según vaya extrayendo los datos del array que me vaya creando campos de texto en la pantalla. Esto se puede hacer?? Estoy mirando en google y no consigo encontrar nada.
Jo!! Todos los dias algo nuevo. Bueno si alguien me puede ayudar se lo agradeceria y a ti SuricatoRojo mil gracias por tu ayuda.
Un saludo.
elSuricatoRojo
Hola de nuevo...
Realmente los datos no están en el array. El array "dataNoticias.arrayNoticias" sirve como índice de los subobjetos que son los que almacenan los datos. Por lo tanto, para acceder a los datos de cada una de las noticias puedes utilizar un for de esta forma:
<code>
for (var i=0; i<dataNoticias.arrayNoticias.length; i++){
var noticiaId:String=dataNoticias.arrayNoticias[i]
var titulo:String=dataNoticias[noticiaId].titulo
var fecha:String=dataNoticias[noticiaId].fecha
var image:String=dataNoticias[noticiaId].image
var logo:String=dataNoticias[noticiaId].logo
// En este punto dispones ya de los datos titulo, fecha, image y logo
// ...para hacer con ellos lo que quieras.
}
</code>
De todas formas tomo esto como una metodología o técnica mas teniendo en cuenta que hay mil formas mas.
un saludo,
elSuricatoRojo
vega_vega
una última pregunta (espero), para extraer los datos que están guardados dentro del array será sufuciente hacer una función e ir extrayendolos con un for o con algo hasta donde yo quiera visualizar no? Esque he probado haciendo esto y parece como si persdiese los datos, por que luego he probado según los iba almacenando que los rellenase y funciona bien. Hago algo mal??
Un saludo y muchísimas gracias, hoy me acuesto sabiendo algo más.
elSuricatoRojo
tienes razón, debería poner:
dataNoticias.arrayNoticias=new Array()
vega_vega
Una cosa al poner:
var dataNoticias.arrayNoticias=new Array()
me da error, porque?? Me pone error de sintaxis.
Le he cambiado el nombre y sigue sin funcionar.
Gracias por la ayuda!! seguiré probando.[/b]
elSuricatoRojo
Mi consejo es que nada mas cargar el xml pases sus datos a u na estructura de da tos con la que te resulte fáci l tra bajar y así te olvidas de navegar por el xml con firstChilds, nextsibilings y demas "leches".
Para un modelo de datos para noticias como el que expones en tu primer post yo interpretaría el xml y obtendría algo así como:
dataNoticias.arrayNoticias=["noticia1", "noticia2", noticia3]
//--
dataNoticias.noticia1.titulo="Feria Wile Dusseldort"
dataNoticias.noticia1.fecha="29.3 - 2.4 2006"
dataNoticias.noticia1.image="feria01.jpg"
dataNoticias.noticia1.logo="logo01.jpg"
//--
dataNoticias.noticia2.titulo="Otra feria
dataNoticias.noticia2.fecha="30.3 - 2.4 2006"
dataNoticias.noticia2.image="feria02.jpg"
dataNoticias.noticia2.logo="logo02.jpg"
//--
etc
...de tal forma que el array "arrayNoticias" te sirve como indice (que puedes utilizar en for's para "navegar" por todas las noticias en el orden adecuado) de los subobjetos de dataNoticias, siendo ese subobjeto el que contiene los datos propios de cada noticia.
Para llegar a ese modelo de datos tienes que interpretar el xml una vez. Te recomiendo en ese caso utilizar "for in" de los childNodes del nodo principal o padre.
<code>
var dataNoticias:Object=new Object()
var dataNoticias.arrayNoticias=new Array()
function inter_objXML(objXML:XML) {
var nodo = objXML.firstChild;
var nodoAnalizado = nodo.childNodes;
var contador:Number=1
for (var subnodos in nodoAnalizado) {
var noticiaId:String="noticia"+contador
inter_item(nodoAnalizado[subnodos], noticiaId);
contador++
}
// Invertimos el array pq el for in "navega" de abajo arriba
dataNoticias.arrayNoticias.reverse();
}
function inter_item(nodo:XMLNode, noticiaId:String) {
dataNoticias.arrayNoticias.push(noticiaId);
dataNoticias[noticiaId] = new Object();
dataNoticias[noticiaId].titulo= extraerValorNodo(nodo, "titulo");
dataNoticias[noticiaId].fecha= extraerValorNodo(nodo, "fecha");
dataNoticias[noticiaId].image= extraerValorNodo(nodo, "image");
dataNoticias[noticiaId].logo= extraerValorNodo(nodo, "logo");
}
function extraerValorNodo(nodo:XMLNode, nombreSubNodo:String):String {
// Dado un objeto XML lo examina y devuelve el nodeValue del subnodo cuyo nombre
// coincida con "nombreSubNodo"
var nombreNodo:String;
var nodoAnalizado:Array = nodo.childNodes;
for (var subNodos in nodoAnalizado) {
nombreNodo = nodoAnalizado[subNodos].nodeName;
if (nombreNodo == nombreSubNodo) {
return (nodoAnalizado[subNodos].firstChild.nodeValue);
break;
}
}
}
</code>
A la función "inter_objXML()" la pasas como parametro el xml ya con whistespaces=false y esa combinación de funciones te genera el modelo de datos que describía al principio.
vega_vega
No he conseguido nada y lo he dejado, por ahora.
Hoy tengo otra pregunta, he puesto para que en el swf se carguen dos nosticias por página, y cuando le de al siguiente que cargue otras dos. Bueno la cuestión es que no consigo que me aparezcan las noticias.
Le tengo puesto que hasta que una variable 2 recorra las acciones, así como al entrar la variable está a 0 me da dos vueltas y sale.
Bueno pues no me hace absolutamente nada. Si alguien me puede dar una pista de como hacer o si hay alguna otra solucion se lo agradeceria mucho.
Un saludo y gracias de antemano.