Как отключить DTD во время выполнения в Java Xpath?
Вопрос
Я получил dtd в файле и не могу удалить его. Когда я пытаюсь разобрать его в Java, я получаю " Причины: java.net.SocketException: сеть недоступна: connect " ;, потому что ее удаленный dtd. можно ли как-то отключить проверку dtd?
Решение
Вы должны быть в состоянии указать свой собственный EntityResolver или использовать определенные функции вашего анализатора? См. здесь , чтобы узнать о некоторых подходах.
Более полный пример:
<?xml version="1.0"?>
<!DOCTYPE foo PUBLIC "//FOO//" "foo.dtd">
<foo>
<bar>Value</bar>
</foo>
И использование 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);
}
}
Надеюсь, это поможет ...
Другие советы
Это сработало для меня:
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();
}
У меня была эта проблема раньше. Я решил это, загрузив и сохранив локальную копию DTD, а затем проверив ее по локальной копии. Вам нужно отредактировать файл XML, чтобы он указывал на локальную копию.
<!DOCTYPE root-element SYSTEM "filename">
Немного больше информации здесь: http://www.w3schools.com/dtd/dtd_intro. ASP р>
Я думаю, вы также можете вручную установить какое-либо свойство validateOnParse на " false " в вашем парсере. Зависит от того, какую библиотеку вы используете для анализа XML.
Дополнительная информация здесь: http://www.w3schools.com/dtd/dtd_validation.asp р>