所以,我有一个像
这样的文件<root>
<transaction ts="1">
<abc><def></def></abc>
</transaction>
<transaction ts="2">
<abc><def></def></abc>
</transaction>
</root>
所以,我有一个条件,如果ts =“2”然后做一些事情......现在问题是当它发现ts =“1”时它仍然扫描标签&lt; ABC&GT;&LT; DEF&GT;然后达到&lt;交易ts =“2”&gt;
当条件与解析中断不匹配并直接查找下一个事务标记时,有没有办法?
答案 0 :(得分:0)
当条件与解析中断时没有匹配时,有没有办法 直接寻找下一个交易标签?
没有。您必须编写SAX解析器以了解何时跳过查看错误事务块中的标记。也就是说,您可能会发现切换到STAX比SAX更容易做到这样的事情。
答案 1 :(得分:0)
sax解析器始终为每个XML元素调用回调
一旦检测到要忽略的条件,您可以通过设置字段isIgnoreCurrentTransaction
来解决您的问题。然后在你的其他sax回调中,你检查isIgnoreCurrentTransaction
amd在这种情况下什么都不做。
答案 2 :(得分:0)
您可以在SAX实现中使用控制标志,当您在某个标签上检测到您的状况时会引发该控制标志,并在您退出标签后再次降低该标志。当解析器遍历您不感兴趣的标记的子项时,可以使用该标志跳过任何处理。
但请注意,您的示例XML无效。在使用SAX实现处理之前,您需要使用正确的标记嵌套,如注释中所述。
答案 3 :(得分:0)
SAX解析器必须扫描所有子树(例如“&lt; abc&gt;&lt; def&gt;&lt; / def&gt;&lt; / abc&gt;”)以了解下一个元素的起始位置。无法绕过它,这也是您无法为单个XML文档并行化XML Parser的原因。
我能想到的只有两种调整方式:
1)如果要解析许多XML文档,可以在自己的线程中为每个文档运行一个Parser。这至少会使整体工作并行化并利用您可用的所有CPU和核心。
2)如果您只需要阅读某个条件(就像您提到的那样&lt; transaction ts =“2”&gt;),您可以在达到该条件后立即跳过解析。如果跳过解析器会有所帮助,那么通过抛出异常就可以了。
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");
}
}