Programación en castellano
-Tutoriales

El API JAXP


Añadir Manejadores de Eventos Adicionales

Junto a ignorableWhitespace, sólo hay otros dos métodos en el interface DocumentHandler: setDocumentLocator y processingInstruction. En esta sección del tutorial implementaremos estos dos manejadores de eventos.

. Identificar la Localización del Documento

Un locator es un objeto que contiene la información necesaria para encontrar un documento. La clase Locator encapsula un ID de sistema (URL) o un identificador público (URN), o ambos. Necesitaremos esta información si queremos encontrar algo relativo al documento actual -- de la misma forma, por ejemplo, que un navegador HTML procesa un atributo href="anotherFile" en una etiqueta de enlace -- el navegador usa la localización del documento actual para encontrar anotherFile.

También podríamos usar el locator para imprimir un buen mensaje de diagnóstico. Además de la localización del documento y el identificador público, el locator contiene métodos que dan los números de columna y de línea de los eventos más recientemente procesados. Al método setDocumentLocator se le llama sólo uan vez al principio del análisis. Para obtener el número de línea o de columna actual, grabaremos el locator cuando se invoque a setDocumentLocator y luego puede ser usado en otros métodos manejadores de eventos.

Nota:

El código descrito en está sección está en Echo04.java. Su salida está almacenada en Echo04-01.log.

Añadimos el siguiente método al programa Echo para obtener el locator del documento y lo usamos para mostrar el ID del sistema del documento.

    ...
    private String indentString = "    "; // Amount to indent
    private int indentLevel = 0;
  
    public void setDocumentLocator (Locator l)
    {
        try {
          out.write ("LOCATOR");
          out.write ("\n SYS ID: " + l.getSystemId() );
          out.flush ();
        } catch (IOException e) {
            // Ignore errors
        }
    }

    public void startDocument ()
    ...
Notas:
  • Este método, en contraste a todos los otros métodos de DocumentHandler, no devuelven una SAXException. Por eso, en vez de usar emit para la salida, este código escribe directamente en System.out. (Este método se espera que grabe el Locator para su uso posterior, en vez de hacer el tipo de proceso que genera una excepción.)

  • El deletreo de estos métodos es "Id", no "ID". Por eso tenemos getSystemId y getPublicId.

Cuando compilemos y ejecutemos el programa sobre slideSample01.xml, podremos ver una salida parecida a esta.

LOCATOR
 SYS ID: file:<path>/samples/slideSample01.xml

START DOCUMENT
<?xml version='1.0' encoding='UTF-8'?>
...

Aquí, es aparente que setDocumentLocator es llamado antes que startDocument. Lo que puede crear alguna diferencia si hacemos alguna inicialización en el código de manejo de eventos.

. Manejar Instrucciones de Procesamiento

Algunas veces tiene sentido codificar instrucciones de proceso especificas de la aplicación en los datos XML. En este ejercicio, añadiremos una instrucción de procesamiento a nuestro fichero slideSample.xml y luego modificaremos el programa Echo para mostrarlo.

Nota:

El código descrito en esta sección está en Echo05.java. Este fichero opera sobre slideSample02.xml. La salida está almacenada en Echo05-02.log.

Como hemos visto en Un Rápida Introducción a XML, el formato de una instrucción de proceso es <?target data?>, donde "target" es la aplicación objetivo que se espera que haga el procesamiento, y "data" es la instrucción o información para el proceso. Añadimos el texto en negrita de abajo para añadir una instrucción de procesamiento para un programa de presentación de diapositivas que le pregunte al usuario para saber qué diapositivas mostrar (técnicas, nivel-ejecutivo, o todas).

<slideshow 
    ...
    >
    
    <!-- PROCESSING INSTRUCTION -->
    <?my.presentation.Program: QUERY="exec, tech, all"?>

    <!-- TITLE SLIDE -->
Notas:
  • La porción "data" de la instrucción de procesamiento puede contener espacios, o incluso podría ser null. Pero no puede haber ningún espacio en blanco entre el <? inicial y el identificador del objetivo.

  • Los datos empiezan después del primer espacio.

  • Cualificar totalmente el objetivo con el prefijo de paquete único web tiene sentido, para evitar conflictos con otros programas que podrían procesar los mismos datos.

  • En este caso, el objetivo incluye dos puntos (:) después del nombre de la aplicación. Esto no es muy típico, pero parece ser una buena idea para una mejor lectura.

Ahora que ya tenemos una instrucción de procesamiento con la que trabajar, añadimos el código en negrita de abajo a la aplicación Echo.

public void characters (char buf [], int offset, int len)
...
}
    
public void processingInstruction (String target, String data)
throws SAXException
{
    nl(); 
    emit ("PROCESS: ");
    emit ("<?"+target+" "+data+"?>");
}

private void emit (String s)
...

Cuando completemos las ediciones, compilamos y ejecutamos el programa. La parte importante de la salida se debería parecer a esto.

...
CHARS:   
CHARS:   
PROCESS: <?my.presentation.Program: QUERY="exec, tech, all"?>
CHARS:   
CHARS:   
...

Ahora que hemos tenido la oportunidad de trabajar con instrucciones de procesamiento, podemos eliminar esa instrucción del fichero XML. No la necesitaremos más.

 
Patrocinados
 

Copyright © 1999-2007 Programación en castellano. Todos los derechos reservados.
Formulario de Contacto - Datos legales - Publicidad
Mantenida por: Claudio y Dani.

Hospedaje web y servidores dedicados linux por Ferca Network

red internet: jugar gratis | amor | navidad 2009 | registro de dominios | servidores dedicados
más internet: comprar | gratis | posicionamiento en buscadores | decoración libre | gifs animados