2010-06-03 28 views

回答

11

在处理程序抛出一个异常,并抓住它的代码块,你开始解析:

try { 
    ... 
    xmlReader.parse(); 
} catch (SAXException e) { 
    if (e.Cause instanceof BreakParsingException) { 
     // we have broken the parsing process 
     .... 
    } 
} 

而在你的DocumentHandler:

public void startElement(String namespaceURI, 
        String localName, 
        String qName, 
        Attributes atts) 
       throws SAXException { 
    // ... 
    throw new SAXException(new BreakParsingException()); 
} 
+5

顺便说一句:2年后,我开始认为我们不得不使用异常来控制流量是非常不幸的。打破解析过程在非错误情况下是完全有效的......如果有人找到更好的解决方案,我会很乐意阅读它! – chiccodoro 2012-08-24 07:16:12

+1

抛出[SAXParseException]的子类(http://www.saxproject.org/apidoc/org/xml/sax/SAXParseException.html),您将在[ErrorHandler](http:// www。 saxproject.org/apidoc/org/xml/sax/ErrorHandler.html)。 – 2012-11-23 06:40:53

2

你必须抛出的SAXException。为了将它从常规错误中提取出来,我将使用我自己的Exception类继承它。

4

简单的解决方案是使用StAX解析 - 而不是SAX。虽然SAX推送解析 - 事件由解析器发送到处理程序,但StAX是解析,事件通过XMLEventReader提供给我们,可以使用类似于迭代器的事件。所以,实现有条件的break可以更容易地打破解析。