comment désactiver dtd au moment de l'exécution dans xpath de java?
Question
J'ai dtd dans le fichier et je ne peux pas l'enlever. Lorsque j'essaie de l'analyser en Java, je suis "provoqué par: java.net.SocketException: le réseau est inaccessible: connectez-vous", car son dtd distant. puis-je désactiver en quelque sorte la vérification de dtd?
La solution
Vous devriez pouvoir spécifier votre propre EntityResolver ou utiliser des fonctionnalités spécifiques de votre analyseur syntaxique? Voir ici 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 de 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);
}
}
J'espère que cela vous aidera ...
Autres conseils
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();
}
J'ai déjà eu ce problème. Je l'ai résolu en téléchargeant et en stockant une copie locale de la DTD, puis en le 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">
Quelques informations supplémentaires ici: http://www.w3schools.com/dtd/dtd_intro. asp
Je pense que vous pouvez également définir manuellement une sorte de propriété validateOnParse sur " false " dans votre analyseur. Dépend de la bibliothèque que vous utilisez pour analyser le code XML.
Plus d'infos ici: http://www.w3schools.com/dtd/dtd_validation.asp