AVBAX es AJAX, pero raro (y III)
Bueno. Por fin vamos a terminar esta serie explicando la mejor utilidad que se le puede dar al AVBAX, esto es, el acceso asíncrono a un archivo XML, que para eso se inventó todo este tinglado; vamos, digo yo…
Supongamos un archivo XML (al que llamaremos archivoxml.xml
para seguir con la originalidad) que guarda grupos de música y álbumes publicados y que contenga las siguientes líneas
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xml>
<Album ref="CD142" categoria="Pop">
<titulo>Guapa</titulo>
<artista>La oreja de Van Gogh</artista>
</Album>
<Album ref="CD720" categoria="Rock">
<titulo>Zapatillas</titulo>
<artista>El canto del loco</artista>
</Album>
<Album ref="CD024" categoria="Rap">
<titulo>Vivir para contarlo</titulo>
<artista>Violadores del verso</artista>
</Album>
</xml>
Veamos primero el procedimiento Sub:
Sub ObtenerDatos()
AVBAX.Open "GET", "archivoxml.xml"
AVBAX.onreadystatechange = Getref("ComprobarEstadoYLeer")
AVBAX.Send()
End Sub
Y ahora la función que recoge los datos (y controla el estado de la transacción):
Function ComprobarEstadoYLeer()
If (AVBAX.readyState = 4) Then
Set XMLDoc = AVBAX.responseXML.documentElement
Set NodosXML = XMLDoc.ChildNodes
For Each Elemento In NodosXML
miCapaContenido.innerHtml = miCapaContenido. _
innerHtml & "<BR>" & Elemento.ChildNodes(0). _
NodeName & ": " & Elemento.ChildNodes(0). _
Text & " // " & Elemento.ChildNodes(1). _
NodeName & ": " & Elemento.ChildNodes(1).Text
Next
miCapaContenido.innerHtml = miCapaContenido. _
innerHtml & "<BR><BR>" & _
"Número de registros: " & NodosXML.Length
Set AVBAX=Nothing
End If
End Function
En este caso deberemos cambiar la propiedad responseText
por responseXML
, haciendo así que se interprete el archivo con su formato original, y no como un simple fichero de texto. Nos creamos una variable que guardará el objeto de elemento del documento con la propiedad documentElement
de responseXML
. Así pues, en XMLDoc
se almacena el objeto de documento completo.
Para poder acceder a los distintos elementos internos del XML (o nodos para los puristas) nos servimos de otra variable para almacenarlos; esta variable será NodosXML
que hace uso de la colección ChildNodes
del objeto XMLDoc
previamente declarado. Y ahora recorremos todos los nodos con un bucle For... Next
.
Mientras leemos los nodos extraemos el nombre de cada subnodo (o nodo hijo con respecto al anterior) con la propiedad NodeName
y su contenido textual con la propiedad Text
. Los índices 0
y 1
se refieren a cada uno de los subnodos dependientes del anterior (0
para <titulo>
y 1
para <artista>
).
Entiéndase bien. Los nodos hijos del documento XML (guardados en NodosXML
) son los distintos <Album>
. Ahora, los nodos hijos de NodosXML son los distintos artistas y títulos de discos.
Todo el resultado se almacena en el innerHtml
de la capa (objeto DIV) llamada miCapaContenido
.
Por último escribimos el número de registros con la propiedad Length
del objeto guardado en NodosXML
.
Disponemos de multitud de propiedades para sacarle jugo a este objeto, entre otras: FirstChild
, NodeType
, NodeValue
, OwnerDocument
o ParentNode
. También métodos: AppendChild
, CloneNode
, HasChildNodes
o RemoveChild
. Pero esto ya corre de vuestra cuenta y de vuestras ganas de investigar. Ajo y agua.