2010-06-07 23 views
9

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); 
    }  
} 

Respuesta

2

tienes dos problemas separados que tienen que hacerse cargo de:

  1. La declaración de espacio de nombres que utiliza el documento.
  2. Poner un atributo xsi:schemaLocation en el archivo para dar una pista (!) donde está el esquema.

Puede omitir con seguridad la segunda parte, ya que la ubicación es solo una pista. No puede omitir la primera parte. El espacio de nombre declarado en el archivo XML se compara con el esquema. Importante, esto:

<xml> ... </xml> 

Es no es lo mismo como esto:

<xml xmlns="urn:foo"> ... </xml> 

Así que hay que declarar el espacio de nombres en el documento XML, de lo contrario no se corresponderá con el esquema y que lo hará obtener este error

+1

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? –

+2

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

+1

Gracias xcut. Investigué sobre filtros y funciona excelentemente. Para otros, vean la solución en mi publicación original anterior. –

Cuestiones relacionadas