Validar XML a través de un XSD en Java

20 noviembre, 2011 3 comentarios

Para un proyecto en Grails (con Java), se me solicito crear alguna forma de validar un documento XML generado por nuestra aplicación, con un XSD entregado por el cliente. Esta validación, pese a no ser decisiva para el proyecto, si se consideraba una ventaja comparativa frente a la competencia, por lo que hice lo que siempre hago cuando no sé por dónde partir: ir a google.

Encontré muchas respuestas pero como suele ocurrir cuando se busca algo demasiado especifico, ninguna fue realmente satisfactoria, así que creé una clase que hiciera todo lo necesario.

El archivo .jar lo pueden descargar desde aquí.

El código fuente lo pueden descargar desde aquí.

Imports necesarios

import validadorxml.*; 

Nombre de la clase

ValidadorXML 

Constructores

Constructor estándar

public ValidadorXML() 

Constructor con Variables a definir

  1. JAXP_Lenguaje Lenguaje de XSD
  2. JAXP_Fuente Fuente del XSD Matriz
  3. WC3_SCHEMA Fuente del XSD Matriz de WC3
public ValidadorXML(String JAXP_Lenguaje, String JAXP_Fuente, String WC3_SCHEMA) 

Métodos

Valida un XML contra un archivo XSD

  1. ruta_XSD Ruta donde se encuentra el archivo XSD (Schema)
  2. Contenido_XML Contenido (En UTF-8) del XML
  3. TextoOArchivo true si es texto UTF-8, false si es una Ruta
public void validarXMLconXSD(String ruta_XSD, String XML_INPUT, boolean TextoOArchivo) 

Obtiene un StringBuilder con todos los errores encontrados de la última validación

public ArrayList obtener_errores() 

Retorna si el XML es válido respecto al XSD de acuerdo a la última validación

public boolean es_valido() 

Funcionamiento

//Se declara el objeto que validará XMLs 
ValidadorXML validador = new ValidadorXML();
//xml un texto pasado en una variable 
validador.validarXMLconXSD("schema.xsd", xml, true); 
//Se envía la dirección de un archivo xml 
validador.validarXMLconXSD("C:/schema.xsd", "C:/documento.xml", false); 
//Obtenemos los errores encontrados alguna de las validaciones precedentes 
ArrayList lista_errores = validador.obtener_errores(); 
Categorías:Desarrollo Etiquetas: , , ,

Intellisense en SQL Server Managment Studio

18 septiembre, 2011 Deja un comentario

Intellisense es un componente de los entornos de desarrollo de Microsoft como Visual Studio que, en simples cuentas, ofrece autocompletación de código en base a un análisis heurístico del mismo, anexado a la documentación propia del lenguaje o aplicación que estemos usando.

Hoy en día, un buen IDE requiere de una herramienta de autocompletación de código eficiente para aumentar la productividad del desarrollo.

Es allí donde nos encontramos con una deficiente autocompletacion de código en la herramienta estrella del manejo de bases de datos en servidores SQL Server, SQL Server Managment Studio.

Como siempre, si algo no es suficientemente bueno, siempre se puede mejorar programando algún add-on o plug-in que mejore una aplicación carente de detalles, y en este caso DevArt proporciona una herramienta llamada SQL Complete, que satisface completamente las necesidades de Intellisense en SSMS.

Pese a ser una aplicación de pago, cuenta con una versión gratuita que ofrece lo suficiente como para ser indispensable.

Es compatible con SSMS 2005 y 2008 y todas sus variaciones.

Pueden descargarlo desde aquí: http://www.devart.com/dbforge/sql/sqlcomplete/

Herencia en Tablas y Clases

Encontré un interesantísimo pasaje que me gustaría compartir. Trata sobre la Herencia en clases para la unificación de tablas en su estandarización en modelos complejos de persistencia y locales.

Resumidamente, la Herencia es una de las grandes cualidades de los Paradigmas Relacionales y de la Orientación a Objetos. Se basa en crear un objeto que contiene atributos que sus heredados compartirán como propiedad, pero no como valor. Es así como se pueden crear arboles de herencia donde como desarrolladores, nos enfocaremos en utilizar la última clase de la rama (la hoja) del árbol, que contendrá todas las propiedades de sus clases padre.

Por ejemplo, un Mamifero cuenta con miembros (extremidades), ojos, orejas y pelo. Un Perro ya tiene todas esas caracteristicas porque es mamifero, y ademas tiene cola, y puede ladrar, asi que podemos definir que tan agudo es su ladrido. Un Gato tambien es mamifero, asi que comparte todo lo de un mamifero y tiene bigotes y puedes realizar saltos de cierta cantidad de metros. Un Chihuahua tiene todas las propiedades de un perro y todas las de un mamifero por consiguiente, pero no tiene las propiedades de los gatos. Esto es un ejemplo de herencia.

Leer más…

Desarrollo por Capas (Parte 1)

Al comenzar el desarrollo de una aplicación, lo primero que todo buen desarrollador (o planificador, según sea el caso), debe hacer es diseñar y modelar la aplicación; que no es más que establecer todas las etapas dentro del desarrollo que deben cumplirse, en qué orden y satisfaciendo que requisitos o necesidades.

Demás está decir que esto ahorra no solo dolores de cabeza, si no que en el mundo laboral, de productividad, empresarial, o como quieran llamarle, se ahorra dinero y tiempo; dos variables tan conectadas que decir “perder tiempo es perder dinero” y “perder dinero es perder el tiempo” se hacen no solo recurrentes, si no que hasta dan ganas de imprimirla y pegarlas frente al escritorio. Si no cumples los plazos acordados, el cliente cobrara una multa; si terminas antes de lo previsto, el cliente no te pagara hasta la fecha pactada y si estableces muchos puntos o etapas con malas estimaciones, probablemente estés pagando más de lo que realmente costaba el trabajo.

Leer más…

Convertir valor / texto a RUT (Chile) en Excel

Si se quisiera convertir el valor o texto: 154785219 a 15.478.521-9 se puede utilizar la siguiente función en Excel 2010 (o similar):

=CONCATENAR(TEXTO(MED(A1;1;LARGO(A1)-1);"#.#.#"); "-"; DERECHA(A1;1))

Todo esto, asumiendo que en A1 esta el numero plano y que la función la aplicamos en una celda distinta.

Ojo que funciona con RUTs que sean de mas o menos que 10 millones.

Actualizado 08 de junio, 2011

Para Excel 2007 o inferior, la función MED era conocida como EXTRAE, por lo que debe utilizarse:

=CONCATENAR(TEXTO(EXTRAE(A1;1;LARGO(A1)-1);"#.#.#"); "-"; DERECHA(A1;1))
Categorías:Ofimática Etiquetas: ,

Número de elementos en Array de Enteros en C/C++

Un Docente de mi Universidad, Matías Valdenegro, me ha indicado que esta solución solo funciona para arreglos finitos o estáticos. En caso de utilizar arreglos dinámicos, sizeof solo retornará el tamaño del primer elemento apuntado por el puntero, es decir, en caso de un int, solo retornará siempre 4. En caso contrario, debe enviarse la cantidad de elementos por parámetro a la función.

Se hace comun en la creación de funciones la necesidad de poder contar la cantidad de elementos dentro de un array de tipo entero.

Con una cadena de texto -o String- (char* o char[n]) es relativamente simple utilizando strlen, pero el problema viene a darse cuando se necesita contar la cantidad de elementos enteros dentro de un array.

En Java se puede utilizar la propiedad length, en C# el metodo Length(), pero en C/C++ por lo general, se le pide al usuario que envie la cantidad de elementos por parametros.

No obstante, realizar este proceso es bastante sencillo utilizando la funcion sizeof.

Sizeof esta definida en el stdio.h (o cstdio en C++) y permite calcular el tamaño (en bytes) de un tipo de dato.

Por lo tanto, si tenemos un array V con n elementos de tipo entero, para saber el tamaño de dicho arreglo:

#include <cstdio>
#include <iostream>

int main()
{
	int V[] = {1,2,3,4,5};
	std::cout<<"Tamaño de un int: "<<sizeof(int)<<std::endl;
	std::cout<<"Tamaño del arreglo V: "<<sizeof(V)<<std::endl;
	std::cout<<"Numero de elementos en V: "<<sizeof(V)/sizeof(int)<<std::endl;

	return 0;
}

Con esa simple linea, se calculara el numero de elementos (total) de un arreglo de tipo como se puede ver a continuacion:

Categorías:Desarrollo Etiquetas: ,

Funciones en Estructuras en C ANSI

La Object Oriented Programming o Programación Orientada a Objetos es un paradigma que permite clasificar variables y funciones en elementos llamados objetos, pasándose a llamar las funciones, “métodos” y las variables de dicho objeto, “atributo”.

Prácticamente todos los lenguajes modernos ya trabajan con esta metodología en mayor o menor medida, pero algunos lenguajes mas antiguos, pero no por eso poco utilizados, no, y aquí subyace la necesidad de crear estos contenedores de funciones y métodos para abstraer un poco el código modular o secuencial que se tenga en frente.

El Lenguaje C (en su estándar ANSI) no permite la creación de clases ni objetos, ya que esto se implementa recién en su “evolución” llamada C++. No obstante, podemos decir que los primeros objetos en realidad se llamaban “estructuras”, que son contenedores de variables agrupadas con un identificador que les hacia independientes del resto de elementos de la aplicación.

typedef struct
{
 int A;
 char B;
 float C;
} estructura;

estructura uno;

uno.A = 2;

El problema de las estructuras es que solo almacenan variables, pues al intentar agregar una función, simplemente dará error.

Es entonces donde se pueden aprovechar los punteros para lograr este propósito, como sigue el siguiente ejemplo:

#include <stdio.h>
struct calculadora {
        int a, b;
        int (*suma) (int a, int b);
} ;

int Suma (int a, int b) {
        return ((int)a + (int)b);
}

int main () {
        struct calculadora prueba;
        prueba.a = 1;
        prueba.b = 2;
        printf ("a: %i - b: %i\n", prueba.a, prueba.b);
        //asignamos la posicion de memoria a la funcion del struct
        prueba.suma = Suma;
        //Lanzamos la funcion
        int p = prueba.suma(prueba.a, prueba.b);  //3
        printf("a + b = %i", p);
        return 0;
}

La clave por lo tanto, es direccionar en algún punto la dirección de memoria de la función real en la función referenciada.

La utilidad de esto es simular un objeto, que puede ser principalmente útil al trabajar con estructuras de datos en C sin pasar a la utilización de clases.

Categorías:Desarrollo Etiquetas: , , , , ,
Seguir

Get every new post delivered to your Inbox.