Búsqueda personalizada

jueves, 23 de abril de 2009

Ejemplo Java, XML y SAX

package samples.xml.sax;

//paquetes de JAXP para usar SAX
import org.xml.sax.*;
import org.xml.sax.helpers.*;

import java.util.*;
import java.io.*;

public class SAXLocalNameCount extends DefaultHandler {

/** Un Hashtable con los nombres de los Tags como llaves y "Integers" como valores */
private Hashtable tags;

// Sobreescribimos el metodo startDocument, esto ejecuta la primera accion que
//se realiza al momento de parsear el documento

public void startDocument() throws SAXException {
tags = new Hashtable();
}


//Sobreescribimos el metodo startElement el cual ocurre cada ves que al parsear
//el documento se encuentra un nuevo elemento.
public void startElement(String namespaceURI, String localName,
String qName, Attributes atts)
throws SAXException//SAXException es la excepcion que nos manda cuando ocurre algun error al momento
{ //De parsear el documento usando SAX.
//LocaName es el nombre del elemento(la etiqueta(tag))
String key = localName;
//Guardamo el valor del tag en un objeto
Object value = tags.get(key);

//Si el valor del tag en el HashTable es null(es la primera vez que se usa ese objeto por lo tanto no hemos guardado con anterioridad ese tag y su valor es nulo) se le pone el valor de 1
if (value == null) {
// Agregamos una nueva entrada al HashTag con elnombre del tag como llaves y 1 como valor
tags.put(key, new Integer(1));
} else {
// Si en el Hashtable ya existia un valor para cierta llave("tan") entonces aumentamos ese valor en uno
int count = ((Integer)value).intValue();
count++;
tags.put(key, new Integer(count));
}
}

// Parser calls this once after parsing a document
//Sobreercribimoel mrtodo endDocument() el cual ejecuta una accion un instante antes de terminar el parseo.
public void endDocument() throws SAXException {
Enumeration e = tags.keys();
while (e.hasMoreElements()) {
String tag = (String)e.nextElement();
int count = ((Integer)tags.get(tag)).intValue();
//imprimimos el numero de ocurrencias de cada tag(el nombre lo obtenemos por que es el mismo nombre de la llave y el valor es el que contiene el HashTable en ese lugar)

System.out.println("Local Name \"" + tag + "\" occurs " + count
+ " times");
}
}


//Sobreescribimos el meto characters este metodo sirve para leer cada cadena de caracteres que
//encuentra al hacer el pars contiene tres parametros ch - los caractetres del documneto XML
// start - la posición inicial del arreglo y length - l numero de caracteres en el arreglo
@Override
public void characters(char[] ch, int start, int length)
throws SAXException
{
//imprimimos todos los caracteres del arreglo
System.out.println( new String(ch,start,length));
}

/**
* Metodo para convertir un archivo en un url.
*/
private static String convertToFileURL(String filename) {
// Pdemos hacer esto de una forma mas facil a partir de java 1.2 con:
// "path = file.toURL().toString()".
String path = new File(filename).getAbsolutePath();
if (File.separatorChar != '/') {
path = path.replace(File.separatorChar, '/');
}
if (!path.startsWith("/")) {
path = "/" + path;
}
return "file:" + path;
}

private static void usage() {
System.err.println("Usage: SAXLocalNameCount [-options] ");
System.err.println(" -dtd = DTD validation");
System.err.println(" -usage or -help = this message");
System.exit(1);
}


//Clase main
static public void main(String[] args) throws Exception {

//nombre del archivo
String filename = null;
//validación DDT
boolean dtdValidate = false;
String schemaSource = null;

// Verificamos si el main tiene argumentos argumentos(si existen) esto nos servirá despues para ver si validamos el DTD,
//Pr cuestioenes de espacio no especificaremso estos, pero tenemos que saber que aunque en tes momento nos marca un error si
//tratamos de invocar los parametros -usage o -help es por que en este momento no se tiene planeado usarlos
//pero es una buena tecnica, mandar un mensaje de eero para que en caso de que alguien mas desee usarlos, sepa
//que tiene que sobreescribir este metodo, y como ya esta pseudoimplementado no tendra que rehacer todo el codigo, solo
//sobreescribir el metodo usage()
for (int i = 0; i < args.length; i++) {
if (args[i].equals("-dtd")) {
dtdValidate = true;
} else if (args[i].equals("-usage")) {
usage();
} else if (args[i].equals("-help")) {
usage();
} else {
filename = args[i];

// Must be last arg
if (i != args.length - 1) {
usage();
}
}
}
if (filename == null) {
usage();
}

// Creamos un Objeto XMLReader
XMLReader xmlReader = XMLReaderFactory.createXMLReader();

// Ponemos el conten handler ContentHandler del XMLReader
xmlReader.setContentHandler(new SAXLocalNameCount());

// Agregamos un manejador de errores despues del parseo
xmlReader.setErrorHandler(new MyErrorHandler(System.err));

// LE decimos al XMLReader que inicie el parseo del documento.
xmlReader.parse(convertToFileURL(filename));
}

// Error handler to report errors and warnings
//Creaos un manejador de errores propio implementando la interfaz ErrorHandler
// y obiamente sobreescribiendo sus metosos
private static class MyErrorHandler implements ErrorHandler {
/** Error handler output goes here */
private PrintStream out;

MyErrorHandler(PrintStream out) {
this.out = out;
}

/**
* Regresa un String con los detalles del la excepcion mandada por el parser
*/
private String getParseExceptionInfo(SAXParseException spe) {
String systemId = spe.getSystemId();
if (systemId == null) {
systemId = "null";
}
String info = "URI=" + systemId +
" Line=" + spe.getLineNumber() +
": " + spe.getMessage();
return info;
}

// Los siguentes metodos son propios el la interfas de SAX: ErrorHandler.

public void warning(SAXParseException spe) throws SAXException {
out.println("Warning: " + getParseExceptionInfo(spe));
}

public void error(SAXParseException spe) throws SAXException {
String message = "Error: " + getParseExceptionInfo(spe);
throw new SAXException(message);
}

public void fatalError(SAXParseException spe) throws SAXException {
String message = "Fatal Error: " + getParseExceptionInfo(spe);
throw new SAXException(message);
}
}
}


/*
* Como podemos ver para hacer un parseo a XML usando SAX, tenemos que ir
* obteniendo los datos con diversos metodos al momento de estar parseando el
* documento, esta es una de las principales ventas y desventas de SAX, ventaja
* por que no tenemos que cargar todo el documento en memoria, eso hace que
* sea mucho mas rapido y mas eficiente, desventaja, por que complica mucho el
* modo de obtener los datos, ya que a fierta tenemos que "atraparlos" al momento
* de hacer el parseo.
*
* Para mas información de los metodos que se pueden sobreescribir al momento
* pueden verlo en
http://java.sun.com/j2se/1.4.2/docs/api/org/xml/sax/package-tree.html
* pero en especial verifiquen los metodos del manejador de Contenido
* http://java.sun.com/j2se/1.4.2/docs/api/org/xml/sax/ContentHandler.html
*
* y el manejador de errores
* http://java.sun.com/j2se/1.4.2/docs/api/org/xml/sax/ErrorHandler.html
*
*

*/

miércoles, 7 de enero de 2009

XML: DOM.. Tipos de nodos

Uno de los problemas muy simples pero mas comunes que me topo cada que trabajo con xml es que al momento de leer los algo en el XML nunca me acuerdo de los tipos de nodos que existe...es decir para leer el contenido de esto... es por eso que les dejo aqui los tipos de nodos que existen

static final int ELEMENT_TYPE = 1;
static final int ATTR_TYPE = 2;
static final int TEXT_TYPE = 3;
static final int CDATA_TYPE = 4;
static final int ENTITYREF_TYPE = 5;
static final int ENTITY_TYPE = 6;
static final int PROCINSTR_TYPE = 7;
static final int COMMENT_TYPE = 8;
static final int DOCUMENT_TYPE = 9;
static final int DOCTYPE_TYPE = 10;
static final int DOCFRAG_TYPE = 11;
static final int NOTATION_TYPE = 12;




Element
Para elementos con nombres como el nodo "em" de XHTML, devolvemos el contenido del nodo entre las etiquetas y apropiadas. Sin embargo, cuando procesamos el contenido de un elemento slideshow, por ejemplo, no incluimos las etiquetas para los elementos slide que contiene, cuando devolvemos el contenido de un nodo, nos saltamos cualquier elemento que sea propiamente mostrado en el árbol.
Text
No hay sorpresa. Para un nodo texto, sólo devolvemos el valor del nodo.
Entity Reference
Al contrario que los nodos CDATA, las entidades de referencia pueden contener múltiples subelementos. Por eso la estrategia es devolver la concatenación de dichos subelementos.
CDATA
Al igual que en un nodo texto, devolvemos el valor del nodo. Sin embargo, como el texto en este caso podría contener ángulos y ampersands, necesitamos convertirlos a una forma en que se muestren de la forma adecuada en el panel HTML.

Por otro lado, hay unos pocos tipos de nodos que no hemos precesado en el código anterior. Merece la pena gastar un momento para examinarlos y entender porqué.

Attribute
Estos nodos no aparecen en el DOM, pero se pueden obtener llamando a getAttributes sobre los nodos elementos
Entity
Estos nodos tampoco aparecen en el DOM. Se obtienen llamando a getEntities sobre nodos DocType
Processing Instruction
Estos nodos no contienen datos mostrables.
Comment
Nada que queremos mostrar.
Document
Este es el nodo raíz del DOM. No hay datos que mostrar de él.
DocType
El nodo DocType contiene la especificación DTD, con o sin punteros externos. Sólo aparece bajo nodo raíz, no tiene nada que mostrar en el árbol.
Document Fragment
Este nodo es equivalente a un nodo documento. Es un nodo raíz que la especificación DOM entiende para contener resultados intermedios durante operaciones de cortar/pegar, por ejemplo.
Notation
Podemos ignorarlos. Estos nodos se usan para incluir datos binarios en el DOM.

viernes, 21 de noviembre de 2008

Valida e-mail

Funcion en javascript que te valida un e-mail

function validateEMail(emailTS) {



var RegExPattern = /[\w-\.]{3,}@([\w-]{2,}\.)*([\w-]{2,}\.)[\w-]{2,4}/;
var errorMessage = 'Correo Electronico incorrecto, porfavor introdusca un correo electronico valido';

if(emailTS != ""){

if (emailTS.match(RegExPattern)) {
} else {

alert(errorMessage);
}
}
}

javascript: validar telefono

Funcion que solo permite la entrada de numeros, espacios y el caracter "-"

function validaTelefono(telefono){


var RegExPatternX = new RegExp("[0123456789 -]");
var errorMessage = 'El numero de telefono solo puede contener numeros, espacios y "-"';

if(telefono != ""){

if (telefono.match(RegExPatternX)) {
}
else {

alert(errorMessage);
}
}
}


les dejo un complemento para la funcion anterior, es una funcioncita que recibe como parametro el id del campo donde esta el telefono y usa la funcion anterior para validarla, esta funcion yo la llamo en un evento onclick sobre el boton que envia el form(o la meto dentro de otra funcion que contiene varias funciones como esta que validan diversos campos y esta otra funcion ya la pongo onclick del boton que envia el form)...


function valiTel(idTelefono){
telef = document.getElementById(idTelefono).value;
validaTelefono(telef);
}

viernes, 3 de octubre de 2008

JSP: Poner import en archivo jsp.

Para poner un import en un jsp ponemos antes de la etiqueta <html>

<%@ page import="java.util.ArrayList" %>

Donde obiamente java.util.ArrayList puede ser cambiado por cualquier otra clase que queramos cambiar.

jueves, 2 de octubre de 2008

Javascript: Delay

Si queremos que una funcion se lleve acabo despues de cierto tiempo por ejemplo 5 segundos despues de que se cargue la pagina es con la funcion setTimeout.

<body onload="setTimeout('functionToActivate()',5000)">

donde functionToActivate() es la funcion que queremos usar y 5000 es el tiempo en milisegundos

miércoles, 1 de octubre de 2008

Como poner una ñ con javascript

Bueno lesdejo un truquito rapido:
la eñ en javascript se escribe así:
String.fromCharCode(209) o String.fromCharCode(241) para Ñ o ñ respectivamente.

es decir si quiero escribir contraseña escribo :


'contrase'+String.fromCharCode(241)+'a'.