关闭XPathExpression中的dtd验证evaluate()

时间:2011-02-22 15:04:30

标签: java dtd xml-parsing

我想要一个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验证,但这很慢。

谢谢,

1 个答案:

答案 0 :(得分:0)

之所以这么慢是因为你强迫对所有节点进行全面扫描,因为你的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);

我修剪它只留下与验证相关的行