Datos XML en una sola variable usando JQuery

Imagina que tienes un archivo data.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<root>
    <item>value1</item>
    <item>value2</item>
    <item>value3</item>
</root>

Estoy tratando de almacenar toda la configuración de datos en una sola variable para usarla en mi código .js usando esto:

$(document).ready(function() {
        'use strict';
        jQuery.extend({
            getValues: function(url) {
            var result = null;
            $.ajax({
                url: url,
                type: 'get',
                dataType: 'xml',
                async: false,
                success: function(data) {
                result = data;
                }
            });
               return result;
            }
        });

        results = $.getValues("data.xml");
        console.log(results);
});

Si actualizo la página obtengo en la variable de resultados un objeto Documento con campos como URL, baseURI, cuerpo...

Si vuelvo a actualizar, obtengo en los resultados un objeto #document con los datos del archivo data.xml:

<root>
    <item>value1</item>
    <item>value2</item>
    <item>value3</item>
</root>

Entonces, el tipo de objeto devuelto cambia cada vez que alguien va a la URL.

Tengo dos preguntas sobre esto:

  1. ¿Cómo puedo hacer que el valor devuelto sea siempre #documento? (que contiene los datos del archivo .xml)

  2. ¿Cómo puedo acceder a un elemento de #document?

He intentado usar:

console.log(results.root.item);
console.log(results.find("item"));

Pero ambos me dan errores.

Tal vez haya una mejor manera de hacer esto (es decir, leer datos xml en una sola variable).

¿Alguna sugerencia?

preguntado el 01 de junio de 12 a las 12:06

2 Respuestas

Está devolviendo el resultado antes de que finalice la solicitud de ajax. Debe esperar a que regrese el ajax, luego llamar a una función de devolución de llamada:

$(document).ready(function() {
        'use strict';
        jQuery.extend({
            getValues: function(url, callback) {
            var result = null;
            $.ajax({
                url: url,
                type: 'get',
                dataType: 'xml',
                async: false,
                success: function(data) {
                    callback.call(this, data);
                }
            });
            }
        });

        $.getValues("data.xml",function(data){
             console.log(data);
        });

});

Respondido el 01 de junio de 12 a las 13:06

Tiene razón, pero para que funcione tuve que eliminar la propiedad "async". Ahora solo necesito saber cómo acceder a un elemento de la variable de datos. - rfc1484

@ rfc1484 oh, me perdí la opción asíncrona. dado que sus datos son xml, puede usar jquery regular para acceder a los elementos: var xml = $(data); entonces por ejemplo xml.find('someelement').attr('someattribute'); - Andy

puede seleccionar etiquetas xml de esta manera:

success: function(data) {
    parser(data);
}

function parser(data) {
 ...
}

Respondido el 01 de junio de 12 a las 13:06

Pero quiero seleccionar las etiquetas xml fuera de la función de éxito de ajax, una vez que se haya devuelto el xml. - rfc1484

@ rfc1484 puede crear una función y pasarle los datos ajax. - indefinido

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.