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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top