2011-01-24 14 views
5

En mi archivo XML Tengo algunas entidades como ’Usando JDOM analizar el archivo XML con DTD externa que no ha sido declarada en el fichero XML

Así que he creado una etiqueta DTD para mi documento XML para definir estos entidades. A continuación se muestra el código de Java utilizado para leer el archivo XML.

SAXBuilder builder = new SAXBuilder(); 
URL url = new URL("http://127.0.0.1:8080/sample/subject.xml");   
InputStream stream = url.openStream(); 
org.jdom.Document document = builder.build(stream); 

Element root = document.getRootElement(); 

Element name = root.getChild("name"); 
result = name.getText(); 
System.err.println(result);

¿Cómo puedo cambiar el código Java para recuperar una DTD a través de HTTP para permitir el análisis de mi documento XML a estar libre de errores?

Ejemplo simplificado del documento xml.


<main> 
    <name>hello &lsquo; world &rsquo; foo &amp; bar </name> 
</main> 
+1

Entidades debe ser declarado antes de que puedan ser utilizados. Si está utilizando referencias de entidad que no han sido declaradas (ya sea dentro del archivo o con una referencia a una DTD externa), tiene un archivo XML no válido. –

+1

De hecho. Mi problema es inyectar la ruta a mi DTD en el xml en tiempo de ejecución, ya que no se hace referencia al dtd dentro del documento xml. La DTD reside en un servidor remoto al que se puede acceder a través de http. –

Respuesta

3

Una forma de hacer esto sería leer el documento y luego validarlo con el transformador:

import java.net.URL; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.transform.OutputKeys; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 

import org.w3c.dom.Document; 
import org.xml.sax.SAXException; 
import org.xml.sax.SAXParseException; 

public class ValidateWithExternalDTD { 
    private static final String URL = "http://127.0.0.1:8080/sample/subject.xml"; 
    private static final String DTD = "http://127.0.0.1/YourDTD.dtd"; 

    public static void main(String args[]) { 
     try { 
      DocumentBuilderFactory factory=     DocumentBuilderFactory.newInstance(); 
      factory.setValidating(true); 
      DocumentBuilder builder = factory.newDocumentBuilder(); 

      // Set the error handler 
      builder.setErrorHandler(new org.xml.sax.ErrorHandler() {     
       public void fatalError(SAXParseException spex) 
         throws SAXException { 
        // output error and exit 
        spex.printStackTrace(); 
        System.exit(0); 
       } 

       public void error(SAXParseException spex) 
         throws SAXParseException { 
        // output error and continue 
        spex.printStackTrace(); 
       } 

       public void warning(SAXParseException spex) 
         throws SAXParseException { 
        // output warning and continue 
        spex.printStackTrace(); 
       } 
      }); 

      // Read the document 
      URL url = new URL(ValidateWithExternalDTD.URL); 
      Document xmlDocument = builder.parse(url.openStream()); 
      DOMSource source = new DOMSource(xmlDocument); 

      // Use the tranformer to validate the document 
      StreamResult result = new StreamResult(System.out);      
      TransformerFactory tf = TransformerFactory.newInstance(); 
      Transformer transformer = tf.newTransformer(); 
      transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, ValidateWithExternalDTD.DTD); 
      transformer.transform(source, result); 

      // Process your document if everything is OK 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 

Otra forma sería la de sustituir el título XML con el título XML más la referencia de DTD

Reemplazar esta:

<?xml version = "1.0"?> 

con esto:

<?xml version = "1.0"?><!DOCTYPE ...> 

Por supuesto, debería reemplazar la primera ocurrencia y no tratar de ir a través de todo el documento XML

Hay que crear una instancia del SAXBuilder pasando verdadera (validar) a su constructor:

SAXBuilder builder = new SAXBuilder(true); 

o llame al:

builder.setValidation(true) 
+1

¿Qué tan grande es el tamaño XML? – DaTroop

+1

¿Qué tan grande es el tamaño XML? ¿Puedo tener un XML de muestra? ¿El documento XML siempre contiene un título XML? – DaTroop

+0

Estoy usando JDOM en comparación con W3C DOM :( –

Cuestiones relacionadas