【问题标题】:Turn off dtd validation in XPathExpression evaluate()在 XPathExpression evaluate() 中关闭 dtd 验证
【发布时间】:2011-02-24 05:54:28
【问题描述】:

我想要一个 xml 文件 (100 Mb) 的小子树,并且需要关闭 DTD 验证,但我找不到任何解决方案。

XPath xpath = XPathFactory.newInstance().newXPath();  
XPathExpression expr = xpath.compile("//HEADER");  
Node node = (Node) expr.evaluate(new InputSource(new FileReader(file)), XPathConstants.NODE);

我尝试使用 DocumentBuilder 并关闭 DTD 验证,但这太慢了。

谢谢,

【问题讨论】:

  • “好慢啊”是什么意思?
  • 抱歉,使用 DocumentBuilder 和 DOM 的解决方案会变慢

标签: java dtd xml-parsing


【解决方案1】:

它这么慢的原因是因为您的 XPath 标准太模糊,所以您强制对所有节点进行全面扫描://HEADER 意味着 XPath 引擎将扫描 100MB 的每个节点以选择那些节点其中节点名称为 HEADER。如果您可以使 XPath 表达式更具体,您应该会看到显着的改进。

除此之外,下面的代码是我过去为了防止 DTD 验证而不得不做的事情。 它将 Xerces 强制为 SAX 解析器,并明确设置了许多 Xerces 特定功能。但同样,这可能不会显着影响响应时间。

import java.io.File;
import java.io.StringReader;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.apache.xerces.jaxp.SAXParserFactoryImpl;
import org.xml.sax.InputSource;

[...]

    private static SAXParserFactory spf ;

    private static SAXParserFactory spf ;

    private BillCooker() throws Exception {

        System.setProperty("javax.xml.parsers.SAXParserFactory", "org.apache.xerces.jaxp.SAXParserFactoryImpl" ) ;

        spf = SAXParserFactoryImpl.newInstance();
        spf.setNamespaceAware(true);
        spf.setValidating(false);
        spf.setFeature("http://xml.org/sax/features/validation", false);
        spf.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);
        spf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);

我对其进行了修剪,只留下与验证相关的行

【讨论】:

    猜你喜欢
    • 2014-01-23
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 2012-08-11
    • 2010-11-22
    • 2016-09-18
    相关资源
    最近更新 更多