2012-01-02 89 views
12

Tengo siguiente archivo XML:¿Cómo validar xml con dtd usando java?

<?xml version = "1.0" ?> 
<Employee> 
<Emp_Id> E-001</Emp_Id> 
<Emp_Name> Vinod </Emp_Name> 
<Emp_E-mail> [email protected] </Emp_E-mail> 
</Employee> 

He siguiente archivo DTD:

<!ELEMENT Employee (Emp_Id, Emp_Name, Emp_E-mail)> 
<!ELEMENT Emp_Id (#PCDATA)> 
<!ELEMENT Emp_Name (#PCDATA)> 
<!ELEMENT Emp_E-mail (#PCDATA)> 

Quiero validar este archivo XML con DTD anterior utilizando Java.

Por favor, ayuda gracias .. :-)

Respuesta

18

Hay tres cosas que debe hacer:

  • Asociar el documento XML de origen con su DTD utilizando una declaración de doctype después la declaración XML:

    <!DOCTYPE Employee SYSTEM "employee.dtd"> 
    

    Nota: La raíz DOCTYPE debe coincidir con el elemento raíz en el XML de origen.

  • setValidating a true en el DocumentBuilderFactory

  • Proporcionar una instancia org.xml.sax.ErrorHandler a la DocumentBuilder usando setErrorHandler

Aquí está un ejemplo completo: documento

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 
domFactory.setValidating(true); 
DocumentBuilder builder = domFactory.newDocumentBuilder(); 
builder.setErrorHandler(new ErrorHandler() { 
    @Override 
    public void error(SAXParseException exception) throws SAXException { 
     // do something more useful in each of these handlers 
     exception.printStackTrace(); 
    } 
    @Override 
    public void fatalError(SAXParseException exception) throws SAXException { 
     exception.printStackTrace(); 
    } 

    @Override 
    public void warning(SAXParseException exception) throws SAXException { 
     exception.printStackTrace(); 
    } 
}); 
Document doc = builder.parse("employee.xml"); 

Fuente:

<?xml version="1.0"?> 
<!DOCTYPE Employee SYSTEM "employee.dtd"> 
<Employee> 
    <Emp_Id> E-001</Emp_Id> 
    <Emp_Name> Vinod </Emp_Name> 
    <Emp_E-mail> [email protected] </Emp_E-mail> 
</Employee> 
+0

Gracias lwburk !! pero no permito cambiar en el archivo xml fuente original. –

+3

@SachinJ: lea el archivo en la memoria, inserte la línea DOCTYPE, haga que el constructor analice la cadena XML en lugar de un archivo de disco. –

1

Sólo tiene que leer los archivos e informar de las excepciones, en su caso. Aquí hay un SAX parser example en el que puede confiar.

Con el fin de validar el XML y DTD sólo tiene que setValidating:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    dbf.setValidating(true); // since the default value is false 

declaran también el uso DTD en el archivo XML:

<?xml version="1.0"?> 
<!DOCTYPE Employee SYSTEM "employee.dtd"> 
<Employee> 
+2

* Elemento raíz del documento "Empleado", debe coincidir con el "empleado" root de DOCTYPE. * –

+0

¡Por supuesto empleado! Gracias ... –

+0

+1 - Gracias por corregir. –

Cuestiones relacionadas