getMenus
Esta es algo más compleja ya que devuelve un conjunto de registros con sus campos sin embargo no requiere ningún parámetro. Podriamos haber usado el método anteriormente descrito pero quiero que veais otro mas: selectSingleNode
Veamos el código
num = idiomaXML.selectSingleNode("/Idioma/menues").childNodes.length
El método tiene un funcionamiento muy parecido a getElementsByTagName salvo que no nos devuelve todos los nodos que encuentre con una determinada etiqueta, sino solo aquel nodo que encuentre donde le pedimos ya sea una ruta absoluta como uso yo, o un comando
xPath de búsqueda. xPath es un lenguaje de búsqueda dentro de XML. Es el SQL del XML. Un cursillo interesante sobre xPath lo podeis encontrar
aqui.
Como veis uso la ruta completa: “/Idioma/menues” y me devolverá todos los childNodes que encuentre bajo el siempre que haya alguno:
if num = 0 then 'Ha habido un problema cargando el xml
set getMenus = nothing
exit function
end if
El significado de “/Idioma/menues” es “Desde el documento (/), baja al nodo raiz
Idioma, baja a el nodo
menues”
Ahora vamos a crear un objeto recordset mucho más manejable en ASP. Lo creamos vacio y asignamos los campos que necesitamos usando el método
Append:
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Fields.Append "url", adVarChar, 255
rs.Fields.Append "texto", adVarChar, 255
rs.Fields.Append "target", adVarChar, 25
Abrimos el recordset y empezamos a insertar los datos que buscamos en el XML en él
rs.Open
for n = 0 to num - 1
rs.AddNew
Fijaos en los valores que buscamos en el XML
rs.Fields("url").Value = idiomaXML.selectSingleNode("/Idioma/menues").childNodes(n).
attributes(0).Value ' url
equivale a <menu
ref="index.asp" target="">Inicio</menu>
rs.Fields("target").Value = idiomaXML.selectSingleNode("/Idioma/menues").childNodes(n).
attributes(1).Value ' target
equivale a <menu ref="index.asp"
target="">Inicio</menu>
rs.Fields("texto").Value = idiomaXML.selectSingleNode("/Idioma/menues").childNodes(n).
childNodes(0).text ' texto
equivale a <menu ref="index.asp" target="">
Inicio</menu>
rs.Update
next
Ponemos el cursor del recordset al inicio de éste y devolvemos el recordset.
rs.moveFirst
set getMenus = rs
set rs = nothing
end function
En términos generales, usaremos
selectSingleNode cuando queramos acceder directamente a un nodo determinado y que éste nos devuelva todo lo que haya por debajo.
getElementsByTagName nos devolverá todos aquellos nodos que contengan una determinada etiqueta. La elección entre uno y otro dependerá de nuestras necesidades (por ejemplo,
getElementsByTagName es ideal para leer bloques completos de una etiqueta determinada –por ejemplo <noticia>- en un RSS)
getLangMenus
Este método es muy similar al anterior por lo que no voy a extender en él. Sólo decir que podríamos haber usado un solo método para ambos (por ejemplo, getItems) enviándole como parámetro la localización del/los nodo(s) que deseemos y que nos lo devolviera en un recordset:
getItems(“/Idioma/menuIdiomas”)
o
getItems(“/Idioma/menues”)