Quiero validar un archivo XML con un esquema XSD. El elemento raíz de los archivos XML no tiene ningún espacio de nombres o detalles xsi. No tiene atributos, tan solo <root>
.Validación Java xsd de xml sin espacio de nombres
He probado el siguiente código de http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi.html sin suerte como reciba cvc-elt.1: Cannot find the declaration of element 'root'
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
File schemaFile = new File("schema.xsd");
Schema xsdScheme = factory.newSchema(schemaFile);
Validator validator = xsdScheme.newValidator();
Source source = new StreamSource(xmlfile);
validator.validate(source);
el XML valida bien con las cabeceras de espacio de nombres incluyen etc (añadido a través de xmlspy), pero yo habría pensado que el xml espacio de nombres podría ser declarado sin tener que editar manualmente el archivo de origen?
Editar y Solución:
public static void validateAgainstXSD(File file) {
try {
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
File schemaFile = new File("path/to/xsd");
Schema xsdScheme = factory.newSchema(schemaFile);
Validator validator = xsdScheme.newValidator();
SAXSource source = new SAXSource(
new NamespaceFilter(XMLReaderFactory.createXMLReader()),
new InputSource(new FileInputStream(file)));
validator.validate(source,null);
} catch (Exception e) {
e.printStackTrace();
}
}
protected static class NamespaceFilter extends XMLFilterImpl {
String requiredNamespace = "namespace";
public NamespaceFilter(XMLReader parent) {
super(parent);
}
@Override
public void startElement(String arg0, String arg1, String arg2, Attributes arg3) throws SAXException {
if(!arg0.equals(requiredNamespace))
arg0 = requiredNamespace;
super.startElement(arg0, arg1, arg2, arg3);
}
}
El documento xml es creado por un tercero, es posible que no hayan agregado el espacio de nombre correcto, ¿hay alguna forma en java de anexar fácilmente este espacio de nombres al elemento raíz xml antes de validar? –
Hay dos cosas que puede hacer al respecto: 1. insértela utilizando la manipulación de cadenas si sabe lo que está haciendo y el formato es bastante estático o mejor 2. cree un filtro SAX que cambie el espacio de nombres (consulte http: // www.saxproject.org/filters.html), y pasar el filtro al Validator. No lo he intentado con un objeto Validator, pero espero que funcione. – xcut
Gracias xcut. Investigué sobre filtros y funciona excelentemente. Para otros, vean la solución en mi publicación original anterior. –