Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关闭XPathExpression evaluate()中的dtd验证_Java_Dtd_Xml Parsing - Fatal编程技术网

Java 关闭XPathExpression evaluate()中的dtd验证

Java 关闭XPathExpression evaluate()中的dtd验证,java,dtd,xml-parsing,Java,Dtd,Xml Parsing,我希望从xml文件(100MB)中提取一个小的子树,并需要关闭DTD验证,但我找不到任何解决方案 XPath xpath = XPathFactory.newInstance().newXPath(); XPathExpression expr = xpath.compile("//HEADER"); Node node = (Node) expr.evaluate(new InputSource(new FileReader(file)), XPathConstants.NODE);

我希望从xml文件(100MB)中提取一个小的子树,并需要关闭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验证,但这太慢了

谢谢


Joo

之所以速度如此之慢,是因为您的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);

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

这太慢了是什么意思?对不起,使用DocumentBuilder和DOM的解决方案是变慢