2008-10-28 5 views
13

J'ai obtenu dtd dans le fichier et je ne peux pas le retirer. Lorsque j'essaie de l'analyser en Java, je reçois "Causé par: java.net.SocketException: Réseau est inaccessible: se connecter", parce que sa distance dtd. puis-je désactiver en quelque sorte la vérification dtd?comment désactiver dtd à l'exécution dans xpath de java?

Répondre

18

Vous devriez être capable de spécifier votre propre EntityResolver, ou utiliser des fonctionnalités spécifiques de votre analyseur? Voir here pour certaines approches.

Un exemple plus complet:

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

et l'utilisation XPath:

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

Hope this helps ...

+0

Merci, ce qui a réduit certains tests unitaires que je faisais par un facteur de 7 –

2

J'ai eu ce problème auparavant. Je l'ai résolu en téléchargeant et en stockant une copie locale de la DTD, puis en la validant par rapport à la copie locale. Vous devez modifier le fichier XML pour qu'il pointe vers la copie locale.

<!DOCTYPE root-element SYSTEM "filename"> 

Un peu plus d'info ici: http://www.w3schools.com/dtd/dtd_intro.asp

Je pense que vous pouvez également définir manuellement une sorte de propriété validateOnParse « false » dans votre analyseur. Cela dépend de la bibliothèque que vous utilisez pour analyser le XML.

Plus d'infos ici: http://www.w3schools.com/dtd/dtd_validation.asp

13

Cela a fonctionné pour moi:

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 - C'est la meilleure réponse ici - cependant il suffit d'utiliser cette ligne seulement: '' saxfac.setFeature ("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); '' –