Validaciones de XML contra XSD En Java
Necesidad validar que un XML está formado de acuerdo a las reglas de un XSD.
Solución Para validar un xml, podemos aplicar lo siguiente:
import javax.xml.XMLConstants; import javax.xml.transform.Source; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; import java.io.IOException; import java.net.URL; import org.apache.xmlbeans.XmlObject; import org.xml.sax.SAXException; public class ValidadorXml { /** * Para crear un Schema a partir de un XSD. */ private static SchemaFactory schemaFactory; static { schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); } public static void validarXml(String pathXsd, XmlObject xml) throws IOException, SAXException { Schema schema = schemaFactory.newSchema(new URL(pathXsd)); Validator validator = schema.newValidator(); Source source = new StreamSource(xml.newInputStream()); validator.validate(source); } }
En el código anterior utilizamos la clase XmlObject. Podemos obtener una instancia de dicho elemento utilizando:
String mensaje = "<hola></hola>"; //cadena que representa el contenido xml.
XmlObject.Factory.parse(mensaje);
Este método constructor de XmlObject acepta varias formas de pasarle el xml a parsear. Es cuestión de buscar la manera que más se adapte a como nosotros recibimos el xml (por un String, archivo, url, etc).
Finalmente, al invocar validator.validate(source); obtendremos la validación del documento. Si no conformara alguna de las condiciones del XSD, arrojará la excepción SAXException, y si no se logra encontrar el xsd, arroja IOException.