SAX解析器跳过一些不被解析的元素?
所以,我有一个类似的文件
所以,我有一个条件,如果ts =“2”然后做某事……现在问题是当它发现ts =“1”时它仍然扫描标签 然后到达
当条件与解析中断不匹配并直接查找下一个事务标记时,有没有办法?
SAX解析器必须扫描所有子树(如“
在你的情况下我只能想到两种调整方式:
1)如果要解析许多XML文档,可以在自己的线程中为每个文档运行一个Parser。 这至少会使整体工作并行化,并利用您可用的所有CPU和核心。
2)如果您只需要读取某个条件(就像您提到的
您在ContentHandler
的startElement
实现如下所示:
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实现处理标记之前,您需要使用正确的标记嵌套,如注释中所述。