Namespaces XML en AS3

Estaba intentando parsear un archivo xml desde ActionScript 3 y me he encontrado con que no funcionaba.
El contenido estaba en el objeto XML pero al intentar acceder a cualquiera de los nodos mediante nombre, AS3 me devolvía un elemento nulo.
Solo lograba hacerlo funcionar si en la cabecera del fichero XML le quitaba la declaración de namespace que se hace mediante el atributo xmlns.
El problema es que el XML lo produce un software de terceros y no tengo control sobre su formato, así que eliminar la declaración del namespace no es posible.

El problema ha sido precisamente el namespace. El atributo xmlns estaba definiendo el nombre del namespace del tipo de archivo XML que estaba leyendo, pero yo no estaba usando dicho namespace para acceder a los elementos del arbol XML, por eso no los encontraba.
El namespace es una clase que se usa prefijando con ella cada nombre de nodo separándolo de este con el operador :: (name qualifier) , por ejemplo

trace( xmldoc.new Namespace("http://www.w3.org/2005/Atom")::news );

Esto es un auténtico coñazo, sobre todo cuando te enteras de que esa URI que se declara en el XML no tiene por qué apuntar a nada en concreto, simplemente debe ser única con respecto a todos los namespaces declarados por otros tipos de archivos XML. Como es un identificador tan largo se suele asignar el objeto Namespace a una constante y acortamos.

private const ATOM = new Namespace( "http://www.w3.org/2005/Atom" );
.
.
.
trace(xmldoc.ATOM::news.ATOM::title);

Pero como sigue siendo un rollo prefijar todos los accesos a los nodos, lo mejor es definir que el namespace por defecto apunte a la declaración correspondiente y ya está. Esto se hace con la orden

default xml namespace =new Namespace( "http://www.w3.org/2005/Atom" );

Y a partir de ese momento todos los accesos a nodos del xml se realizarán como si fuesen prefijados con ese namespace.

Así todo vuelve a funcionar.

2 comentarios en “Namespaces XML en AS3

  1. josito

    Hola Makinolo

    te escribo aqui por que no se donde hacerlo y despues de leer tu pagina que por cierto es todo un puntazo te queria preguntar si sabes como hacer en una HP IPAQ H2200 no pierda la señal del bluetooth cuando la tengo conectada con la antena movil de gps en el coche.

    Gracias

    mi correo jositosss@hotmail.com

  2. Makinolo Autor del post

    Hola josito

    A mi me ocurría algo similar muy a menudo y no sabía por qué sucedía. Resulta que usaba un imán bastante potente para fijar la PDA al salpicadero del coche. En cuanto alejaba la PDA del imán las desconexiones casi desaparecieron. Probablemente tengas alguna fuente de interferencias en el coche que hace que la señal de Bluetooth se pierda.

Deja un comentario

Tu dirección de correo electrónico no será publicada.