Ver Mensaje Individual
  #12 (permalink)  
Antiguo 12/10/2007, 12:07
tammander
 
Fecha de Ingreso: enero-2006
Ubicación: Torroles (Costa der Só)
Mensajes: 1.017
Antigüedad: 19 años, 1 mes
Puntos: 7
Re: ASP y XML – Una aproximación: Cambiar el idioma a nuestro sitio web

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”)
__________________
"Tus pecados son el estiércol sobre el que florecerán las flores de tus virtudes" - Gerald Messadié -