jQuery XML no funciona bien en IE7 ni IE8

El framework  jQuery nos ha facilitado a los desarrolladores el acceso a los datos XML que provienen de AJAX; pero también permite leer XML contenido en la propia página con javascript. Eso sí, funciona mucho mejor en Chrome y Firefox que en Internet explorer.

Si en un input tenemos el siguiente texto:

<granja>
<animal id="0001">vaca</animal>
<animal id="0002">oveja</animal>
<animal id="0003">gallina</animal>
</granja>

Con jQuery podemos recorrerlo directamente con este código:

$(inputXML.value).find('animal').each(
function(){
$(this).text (); //devuelve el texto
$(this).attr ('id'); // devuelve un atributo
});

Como veréis, es mucho más intuitivo y rápido que utilizar directamente  los métodos de la clase XMLHttpRequest.

Eso sí, en Chrome y Firefox porque la función find no nos funcionará en IE7 e IE8 (esto es lo mismo que decir en todos los Windows XP que hay todavía activos, y que son muchos).

Esto es debido a que IE detectará que estamos en un documento HTML y no XML y lo podemos solventar así:

var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.loadXML(inputXML.value);
$("granja", xmlDoc).find("animal").each( function() {
$(this).text (); //devuelve el texto
$(this).attr ('id'); // devuelve un atributo
});

En mi caso, se trata de un aplicativo que siempre se accederá con IE7 (se ejecuta en un entorno controlado) pero si deseamos publicar algo así, deberíamos utilizar el objeto XMLDOM correcto para cada navegador – lo sé, qué rollo.

if (window.DOMParser)
{
parser=new DOMParser();
xmlDoc=parser.parseFromString(inputXML.value,"text/xml");
}
else // Internet Explorer
{
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.loadXML(inputXML.value);
}

Ultima hora:

Si las claves de XML vienen del serializado de un objeto, IE8 nos va a exigir que las marcas XML no contengan información sobre paquete: <es.josedetorre.MiClase>dato</es.josedetorre.MiClase> es inválido.

El error que da es “sólo se admite un elemento de nivel superior en un documento XML” aunque el fichero esté bien formado.

La solución es serializar sin información de paquete: <MiClase>datos</MiClase>

Mamá, soy programador

Teclado - Control! by FaraMarz

Teclado - una foto de FaraMarz

Mi madre y mucha gente que conozco no tiene claro a qué me dedico, así que reproduzco aquí la conversación que tuve con ella durante mi segundo sueño de anoche. Recordad que la conversación ha sido onírica y que puede que haya detalles que no recuerde bien.

Mamá – ¿Pero tú no eres informático?

José Manuel – Sí claro, pero la informática no es  sólo una profesión sino muchas profesiones. Decir que te dedicas a la Informática es como decir que te dedicas a la construcción* donde hay fontaneros, alicatadores, escayolistas …

*nota: mucha de mi familia se dedica a la construcción, por eso creo que en el sueño lo usaba de ejemplo

M – ¿Y entonces qué es la informática?

La informática se encarga de recoger, transformar, almacenar y distribuir información a través de máquinas. Hay especialistas en esas tareas y en otras más.

¿Y a qué parte te dedicas tú?

Yo trabajo como desarrollador. También nos llaman programadores. Le digo al ordenador qué tiene que hacer en cada momento.

¿Y cómo lo haces?

Se lo escribo. El ordenador lo lee y sabe qué tiene que hacer.

¡Ah! ¿Y se escribe en Inglés o cómo?

Se escribe con lenguajes de programación. Son lenguajes sólo para programar. Usan palabras en inglés y simbolitos. Existen muchos lenguajes y muy variados y en mi caso no basta con saber uno solo.

Pero en la tele dicen que cualquiera puede aprender a programar… ¿Para eso te hemos pagado una carrera?

Los programas pueden ser muy grandes y hay que saber dividir las tareas. Para eso hace falta experiencia o tener buena formación. Además hay diferentes tipos de lenguajes, y con frecuencia hay que aprender lenguajes nuevos.

Cualquiera puede programar, como cualquiera puede pintar una casa. Pero lo mismo que necesitas un pintor para hacer un estucado, necesitas un programador para hacer trabajos profesionales.

Pero tú sabes mucho de ordenadores, todos te pedimos ayuda con los virus, con la impresora, con las averías …

Ya te conté que hay muchas profesiones dentro de la Informática. Me he especializado en programación, pero sé hacer algunos mantenimientos. Como ya te dije, cualquiera puede aprender a hacer tareas sencillas, lo mismo que a pintar una pared o poner un enchufe.

Los que ponéis interés, aprendéis  a hacerlo por vosotros mismos.

Es importante para un desarrollador conocer cómo es el trabajo de los profesionales con los que colabora. En mi caso, es interesante saber cómo se mantienen a punto los ordenadores, como se transmiten los datos, cómo funciona la seguridad y otras cosas…

Entonces empecé a usar lenguaje técnico y mi madre se transformó en un entrevistador para un puesto en una nueva empresa, pero eso es otro sueño que os contaré otro día.

Error en Apache 2.2.11 contra XP Home SP3

He instalado dos paquetes de aplicaciones para desarrollo distribuido que incluyen un servidor Apache, una base de datos MySQL y PHP. Ambos traen Apache 2.2.11.

El caso es que al arrancar el servidor Apache, me aparece en el log una línea como ésta:

Encountered too many errors accepting client connections. Possible causes: dynamic address renewal, or incompatible VPN or firewall software. Try using the Win32DisableAcceptEx directive.

La documentación de Apache dice que:

AcceptEx() es una API WinSock v2 de Microsoft que ofrece algunas mejoras en el rendimiento sobre la API accept() de tipo BSD bajo ciertas condiciones. Algunos productos populares de Microsoft, sobre todo antivirus o aplicaciones para implemetar redes privadas virtuales, tienen errores de programación que interfieren con el funcionamiento de AcceptEx()

Por seguridad, no voy a indicar concretamente la configuración de mi PC, pero tengo el firewall de Windows y otro propietario, funcionando. No son el problema porque los he desactivado y el problema persistía. Y un antivirus gratuito. No he llegado a probar sin antivirus porque de ser el problema no me planteo cambiarlo.

Apache funciona con un servicio llamado httpd (con claro origen linux) y no sabía donde meter dicha directiva. Así que abrí el httpd.conf, y escribí en una línea separada Win32DisableAcceptEx y funcionó, ya arranca y me sirve los datos.

Así que, a programar!

Enlaces:

http://www.wampserver.com/en/
http://www.apachefriends.org/es/xampp.html