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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top