Validar XML con XSD cargados de forma dinámica en MuleSoft

Francisco Javier Toscano Lopez
Another Integration Blog
2 min readApr 10, 2024

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.

--

--