Autor Tema: getElementById recuperar información de archivos XML con Ajax Ejercicio CU01211F  (Leído 2428 veces)

Dimitar Stefanov

  • Experto
  • *****
  • Mensajes: 598
    • Ver Perfil
Buenas tardes. Expongo una posible solución del ejercicio CU01211F del curso Ajax desde cero.

Citar
EJERCICIO                                                                                                       

Lee este texto que hemos extraído del artículo: ¿Qué es y para qué sirve XML? disponible en http://aprenderaprogramar.com/index.php?option=com_content&view=article&id=102:ique-es-y-para-que-sirve-el-lenguaje-de-etiquetas-xml-extensible-markup-language&catid=46:lenguajes-y-entornos&Itemid=163

 Las etiquetas XML pueden tener atributos, que son una manera de incorporar características o propiedades a las etiquetas de un documento. El atributo consta de dos partes: La propiedad del elemento y el valor  de la propiedad, que siempre va entre comillas doble (“) o simple (‘). Por ejemplo: modelo y color serian atributos de la etiqueta Vehiculo:
 <Vehiculo marca="Toyota" modelo="45 TC" color="plomo">En venta</Vehiculo>

Considera el siguiente documento xml al que denominamos ejemplo.xml:

Código: [Seleccionar]
<?xml version="1.0"?>
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <price type="high">44.95</price>
      <publish_date>2000-10-01</publish_date>
   </book>
   <book id="bk102">
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
      <price type="low">5.95</price>
      <publish_date>2000-12-16</publish_date>
   </book>
   <book id="bk103">
      <author>Corets, Eva</author>
      <title>Maeve Ascendant</title>
      <price type="low">5.95</price>
      <publish_date>2000-11-17</publish_date>
   </book>
</catalog>

Citar
A priori podríamos pensar en usar getElementById para recuperar información del documento xml con Ajax. Pero esta función no responde con documentos XML, como explica este texto en inglés:

Non-HTML documents. The DOM implementation must have information that says which attributes are of type ID. Attributes with the name "id" are not of type ID unless so defined in the document's DTD. The id attribute is defined to be of ID type in the common cases of XHTML, XUL, and other. Implementations that do not know whether attributes are of type ID or not are expected to return null.

a) Usa el archivo ejemplo.xml y coloca un botón que intente recuperar usando ajax y getElementById el contenido del elemento con id="bk101" ¿Qué código has empleado? ¿Qué resultado obtienes?

Código HTML:

Código: [Seleccionar]
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Ejemplo Ajax</title>
<script type="text/javascript">

function recuperarDatos(){

var xmlhttp = new XMLHttpRequest();

xmlhttp.onreadystatechange = function(){
if(xmlhttp.readyState==4 && xmlhttp.status==200){
var xmlDoc = xmlhttp.responseXML;
var nodoBook = xmlDoc.getElementById("bk101");
alert(nodoBook.innerHTML);

}
}

xmlhttp.open("GET", "CU01211F(01).xml");
xmlhttp.send();
}

</script>
</head>
<body>
<button onclick="recuperarDatos()">Recuperar Datos</button>
</body>
</html>

Puedo visualizar  el contenido del elemento con id="bk101".

Citar
b) Usa el archivo ejemplo.xml y coloca un botón que intente recuperar usando ajax y la función que hemos visto anteriormente getElementByIdMXL(the_node,the_id) el contenido del elemento con id="bk101" ¿Qué código has empleado? ¿Qué resultado obtienes?

Código HTML:

Código: [Seleccionar]
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Ejemplo Ajax</title>
<script type="text/javascript">

function recuperarDatos(){

var xmlhttp = new XMLHttpRequest();

xmlhttp.onreadystatechange = function(){
if(xmlhttp.readyState==4 && xmlhttp.status==200){
var xmlDoc = xmlhttp.responseXML;
var nodoBook = getElementByIdMXL(xmlDoc, 'bk101');
alert(nodoBook.innerHTML);

}
}

xmlhttp.open("GET", "CU01211F(01).xml");
xmlhttp.send();
}

function getElementByIdMXL(the_node,the_id) {
    //Nos traemos todos los nodos con cualquier tag del documento xml
    node_tags = the_node.getElementsByTagName('*');
    for (i=0;i<node_tags.length;i++) {
    // Comprobamos si existe un atributo id
        if (node_tags[i].hasAttribute('id')) {
            // Si existe el atributo id comprobamos si coincide con el buscado
            if (node_tags[i].getAttribute('id') == the_id) {
                // Devolvemos el nodo que tiene el id buscado, solo el primero ya que debe ser único
                return node_tags[i];
            }
        }
    }
}

</script>
</head>
<body>
<button onclick="recuperarDatos()">Recuperar Datos</button>
</body>
</html>

Puedo visualizar el contenido del elemento con id="bk101".

Citar
c) Usa el archivo ejemplo.xml y coloca un botón que intente recuperar usando ajax y la función que hemos visto anteriormente getElementsByAttribute(the_attribute, the_value, the_node) todos los precios que lleven como atributo type "low" ¿Qué código has empleado? ¿Qué resultado obtienes?

Código HTML:

Código: [Seleccionar]
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Ejemplo Ajax</title>
<script type="text/javascript">

function recuperarDatos(){

var xmlhttp = new XMLHttpRequest();

xmlhttp.onreadystatechange = function(){
if(xmlhttp.readyState==4 && xmlhttp.status==200){
var xmlDoc = xmlhttp.responseXML;
var nodoBook = getElementsByAttribute('type', 'low', xmlDoc);
for(var i=0; i<nodoBook.length; i++){
alert(nodoBook[i].innerHTML);
}


}
}

xmlhttp.open("GET", "CU01211F(01).xml");
xmlhttp.send();
}

function getElementsByAttribute(the_attribute, the_value, the_node) {
if(the_node == null){
the_node = document;
}
var node_tags = the_node.getElementsByTagName('*');
var results = new Array();
for (i=0, j=0; i<node_tags.length;i++){
    if(node_tags[i].hasAttribute(the_attribute)){
        if(node_tags[i].getAttribute(the_attribute) == the_value){
            results[j] = node_tags[i];
            j++;
            }
        }
}
return results;
}

</script>
</head>
<body>
<button onclick="recuperarDatos()">Recuperar Datos</button>
</body>
</html>

Recuperamos todos los precios que lleven como atributo type "low".

De los tres apartados del ejercicio concluyo que anteriormente no funcionaba el método "getElementById" en XML y Ajax, pero en la actualidad sí. Llego a esta conclusión, porque en el primer apartado me funcionó bien dicho método.

Gracias.
« Última modificación: 01 de Julio 2016, 21:44 por Mario R. Rancel »

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Buenas noches, parece que ocurre tal como has explicado, que getElementById anteriormente no funcionaba pero ahora sí, veo un comentario similar en otro hilo. Saludos.

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".