¿Cómo validar un archivo XML con un archivo XSD?

Resuelto Jeff asked hace 16 años • 13 respuestas

Estoy generando algunos archivos xml que deben ajustarse a un archivo xsd que me entregaron. ¿Cómo debo verificar que se ajusten?

Jeff avatar Aug 19 '08 11:08 Jeff
Aceptado

La biblioteca de tiempo de ejecución de Java admite la validación. La última vez que verifiqué esto era el analizador Apache Xerces debajo de las sábanas. Probablemente deberías usar javax.xml.validation.Validator .

import javax.xml.XMLConstants;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.*;
import java.net.URL;
import org.xml.sax.SAXException;
//import java.io.File; // if you use File
import java.io.IOException;
...
URL schemaFile = new URL("http://host:port/filename.xsd");
// webapp example xsd: 
// URL schemaFile = new URL("http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd");
// local file example:
// File schemaFile = new File("/location/to/localfile.xsd"); // etc.
Source xmlFile = new StreamSource(new File("web.xml"));
SchemaFactory schemaFactory = SchemaFactory
    .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
try {
  Schema schema = schemaFactory.newSchema(schemaFile);
  Validator validator = schema.newValidator();
  validator.validate(xmlFile);
  System.out.println(xmlFile.getSystemId() + " is valid");
} catch (SAXException e) {
  System.out.println(xmlFile.getSystemId() + " is NOT valid reason:" + e);
} catch (IOException e) {}

La constante de fábrica de esquemas es la cadena http://www.w3.org/2001/XMLSchemaque define los XSD. El código anterior valida un descriptor de implementación WAR con la URL http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd, pero usted podría validarlo con la misma facilidad con un archivo local.

No debe utilizar DOMParser para validar un documento (a menos que su objetivo sea crear un modelo de objetos de documento de todos modos). Esto comenzará a crear objetos DOM a medida que analiza el documento, lo que es un desperdicio si no los va a utilizar.

McDowell avatar Aug 19 '2008 12:08 McDowell

Aquí se explica cómo hacerlo usando Xerces2 . Un tutorial para esto, aquí (requiere registro).

Atribución original: copiada descaradamente de aquí :

import org.apache.xerces.parsers.DOMParser;
import java.io.File;
import org.w3c.dom.Document;

public class SchemaTest {
  public static void main (String args[]) {
      File docFile = new File("memory.xml");
      try {
        DOMParser parser = new DOMParser();
        parser.setFeature("http://xml.org/sax/features/validation", true);
        parser.setProperty(
             "http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation", 
             "memory.xsd");
        ErrorChecker errors = new ErrorChecker();
        parser.setErrorHandler(errors);
        parser.parse("memory.xml");
     } catch (Exception e) {
        System.out.print("Problem parsing the file.");
     }
  }
}
SCdF avatar Aug 19 '2008 05:08 SCdF