SAX 解析器必须扫描所有子树(如您的“<abc>< def>< /def>< /abc>”)以了解下一个元素的开始位置。无法绕过它,这也是您无法为单个 XML 文档并行化 XML Parser 的原因。
在您的情况下,我能想到的唯一两种调整方式:
1) 如果您有许多 XML 文档要解析,您可以在其自己的线程中为每个文档运行一个 Parser。这至少可以并行化整个工作并利用所有可用的 CPU 和内核。
2)如果您只需要阅读某个条件(如您提到的 <transaction ts="2">),您可以在达到该条件后立即跳过解析。如果跳过解析器会有所帮助,那么解决方法是抛出异常。
您在startElement
内部的实现ContentHandler
将如下所示:
public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
if(atts == null) return;
if(localName.equals("transaction") && "2".equals(atts.getValue("ts"))) {
// TODO: Whatever should happen when condition is reached
throw new SAXException("Condition reached. Just skip rest of parsing");
}
}