wie dtd zur Laufzeit in Java XPath deaktivieren?
Frage
Ich habe in der Datei dtd und ich kann es nicht entfernen. Wenn ich versuche, es in Java zu analysieren Ich erhalte „Verursacht durch: java.net.SocketException: Netzwerk nicht erreichbar ist: connect“, weil seine Remote dtd. kann ich irgendwie dtd Prüfung deaktivieren?
Lösung
Es soll möglich sein, eigene EntityResolver angeben oder bestimmte Funktionen Ihres Parser verwenden? Siehe hier für einige Ansätze.
Ein vollständigeres Beispiel:
<?xml version="1.0"?>
<!DOCTYPE foo PUBLIC "//FOO//" "foo.dtd">
<foo>
<bar>Value</bar>
</foo>
und XPath Nutzung:
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, das hilft ...
Andere Tipps
Das funktioniert für mich:
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();
}
Ich hatte dieses Problem vor. Ich löste es durch das Herunterladen und eine lokale Kopie der DTD zu speichern und dann auf die lokale Kopie zu validieren. Sie müssen die XML-Datei bearbeiten, um die lokale Kopie zu zeigen.
<!DOCTYPE root-element SYSTEM "filename">
Little weitere Informationen hier: http://www.w3schools.com/dtd/dtd_intro. asp
Ich glaube, Sie können auch manuell eine Art validateOnParse Eigenschaft auf „false“ in Ihrem Parser. Hängt davon ab, welche Bibliothek Sie verwenden den XML zu analysieren.
Weitere Informationen hier: http://www.w3schools.com/dtd/dtd_validation.asp