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

时间:2013-08-05 18:04:41

标签: java parsing sax

所以,我有一个像

这样的文件
<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;

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

4 个答案:

答案 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;),您可以在达到该条件后立即跳过解析。如果跳过解析器会有所帮助,那么通过抛出异常就可以了。

startElementContentHandler的实施方式如下:

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