SAX解析器跳过一些不被解析的元素?

所以,我有一个类似的文件

        

所以,我有一个条件,如果ts =“2”然后做某事……现在问题是当它发现ts =“1”时它仍然扫描标签 然后到达

当条件与解析中断不匹配并直接查找下一个事务标记时,有没有办法?

SAX解析器必须扫描所有子树(如“ ”)以了解下一个元素的起始位置。 无法绕过它,这也是您无法为单个XML文档并行化XML Parser的原因。

在你的情况下我只能想到两种调整方式:

1)如果要解析许多XML文档,可以在自己的线程中为每个文档运行一个Parser。 这至少会使整体工作并行化,并利用您可用的所有CPU和核心。

2)如果您只需要读取某个条件(就像您提到的),您可以在达到该条件时立即跳过解析。 如果跳过解析器会有所帮助,那么通过抛出exception就可以了。

您在ContentHandlerstartElement实现如下所示:

 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"); } } 

当条件与解析中断不匹配并直接查找下一个事务标记时,有没有办法?

不需要。您必须编写SAX解析器以了解何时跳过查看错误事务块中的标记。 也就是说,你可能会发现切换到STAX比SAX更容易做到这样的事情。

sax解析器始终为每个XML元素调用回调。
一旦检测到要忽略的条件,就可以通过设置字段isIgnoreCurrentTransaction来解决您的问题。 然后在你的其他sax回调中检查isIgnoreCurrentTransaction amd在这种情况下根本不做任何事情。

您可以在SAX实现中使用控制标志,当您检测某个标签上的条件时会引发该标志,并在退出标签后再次降低标志。 当解析器运行您不感兴趣的标记的子项时,可以使用该标志跳过任何处理。

但请注意,您的示例XML无效。 在使用SAX实现处理标记之前,您需要使用正确的标记嵌套,如注释中所述。