2008-10-28 4 views

Respuesta

18

¿Debería poder especificar su propio EntityResolver, o usar características específicas de su analizador? Ver here para algunos enfoques.

Un ejemplo más completo:

<?xml version="1.0"?> 
<!DOCTYPE foo PUBLIC "//FOO//" "foo.dtd"> 
<foo> 
    <bar>Value</bar> 
</foo> 

y XPath uso:

import java.io.File; 
import java.io.IOException; 
import java.io.StringReader; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.xpath.XPath; 
import javax.xml.xpath.XPathFactory; 

import org.w3c.dom.Document; 
import org.xml.sax.EntityResolver; 
import org.xml.sax.InputSource; 
import org.xml.sax.SAXException; 

public class Main { 

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

     builder.setEntityResolver(new EntityResolver() { 

      @Override 
      public InputSource resolveEntity(String publicId, String systemId) 
        throws SAXException, IOException { 
       System.out.println("Ignoring " + publicId + ", " + systemId); 
       return new InputSource(new StringReader("")); 
      } 
     }); 
     Document document = builder.parse(new File("src/foo.xml")); 
     XPathFactory xpathFactory = XPathFactory.newInstance(); 
     XPath xpath = xpathFactory.newXPath(); 
     String content = xpath.evaluate("/foo/bar/text()", document 
       .getDocumentElement()); 
     System.out.println(content); 
    } 
} 

Espero que esto ayude ...

+0

Gracias, esto redujo alguna prueba de la unidad que estaba haciendo en un factor de 7. –

2

he tenido este problema antes. Lo resolví descargando y almacenando una copia local de la DTD y luego validando contra la copia local. Necesita editar el archivo XML para apuntar a la copia local.

<!DOCTYPE root-element SYSTEM "filename"> 

Poco más información aquí: http://www.w3schools.com/dtd/dtd_intro.asp

creo que también se puede configurar manualmente una especie de validateOnParse propiedad a "falso" en su programa de análisis. Depende de qué biblioteca estés usando para analizar el XML.

Más información aquí: http://www.w3schools.com/dtd/dtd_validation.asp

13

Esto funcionó para mí:

SAXParserFactory saxfac = SAXParserFactory.newInstance(); 
    saxfac.setValidating(false); 
    try { 
    saxfac.setFeature("http://xml.org/sax/features/validation", false); 
    saxfac.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false); 
    saxfac.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 
    saxfac.setFeature("http://xml.org/sax/features/external-general-entities", false); 
    saxfac.setFeature("http://xml.org/sax/features/external-parameter-entities", false); 
    } 
    catch (Exception e1) { 
    e1.printStackTrace(); 
    } 
+3

1 - Esta es la mejor respuesta aquí - sin embargo, es suficiente usar esta línea solamente: '' saxfac.setFeature ("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); '' –

Cuestiones relacionadas