我在文件中得到了dtd,我无法将其删除.当我尝试用Java解析它时,我得到"引起:java.net.SocketException:网络无法访问:连接",因为它的远程dtd.我能以某种方式禁用dtd检查吗?
您应该能够指定自己的EntityResolver,还是使用解析器的特定功能?有关方法,请参见此处.
一个更完整的例子:
Value
和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(); }