Validar XML con XSD cargados de forma dinámica en MuleSoft
Buenas a tod@s hoy os traigo como he resuelto un problema que parece tonto pero que MuleSoft no ha caido en se puede dar.
Os cuento un poco mi problema.
NECESIDAD: Poder validar la estructura XML con un XSD
QUE NOS PROPORCIONA MULESOFT: MuleSoft tiene el componente XML y dentro la operación Validate Schema. Con las siguientes opciones
- Schema: donde se indican la dirección de los ficheros xsd que se encuentran físicamente en el proyecto
- Schema content: Aquí directamente podemos escribir los Schema xsd si no tenemos los ficheros
- Schema language: se indica el protocolo que sigue, yo lo dejo siempre en W3C
- Content: La variable en formato XML que queremos validar
PROBLEMA: Que no podemos cargar xsd que tengamos en una Base de Datos o los seteamos en tiempo de ejecución. El componente de MuleSoft no permite cargar de forma dinámica los esquemas XSD.
SOLUCION: Pues crear una pequeña funcion Java que haga el trabajo sucio, :)
A continuación os pongo el codigo de la clase
public static boolean validateXSD(String xsdString, String xmlString) {
Boolean result = false;
try {
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(new StreamSource(new ByteArrayInputStream(xsdString.getBytes())));
// Crear un validador basado en el esquema
Validator validator = schema.newValidator();
// Validar el archivo XML utilizando el validador
validator.validate(new StreamSource(new ByteArrayInputStream(xmlString.getBytes())));
result = true; // Si no hay excepciones, el archivo es válido
} catch (SAXException e) {
// El archivo XML no es válido según el esquema XSD
throw new ValidateXSDException("Error al validar el archivo XML: " + e.getMessage());
} catch (IOException e) {
throw new ValidateXSDException("Error de E/S: " + e.getMessage());
}
return result;
}
La lógica es muy simple,
- Se le proporciona el String con el XSD y el XML como parametros de entrada
- Se utiliza la clase StreamSource para simular la creación de un fichero pero en memoria.
- Se utiliza la clase ByteArrayInputStream para crear la fuente de entrada
- Se pasa el array de byte de los string parametros de entrada.
- y con la orden validator.validate() se hace la magia
Aquí la gracia la tiene el Objeto StreamSource que permite cargar en memoria y simular la creación de un objeto File.
despues lo unico que tenemos que hacer es llamarlo desde un componente invoke static de Java dentro del flujo y listo.
Espero que os haya gustado, mañana mas.