El API JAXP

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.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO