|
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:
|
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:
|
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.
Me ha aclarado muchas ideas
















































