How to stop parsing xml document with SAX at any time?

后端 未结 3 1403
清歌不尽
清歌不尽 2020-11-27 07:08

I parse a big xml document with Sax, I want to stop parsing the document when some condition establish? How to do?

相关标签:
3条回答
  • 2020-11-27 07:40

    I am not aware of a mechanism to abort SAX parsing other than the exception throwing technique outlined by Tom. An alternative is to switch to using the StAX parser (see pull vs push).

    0 讨论(0)
  • 2020-11-27 07:55

    I use a boolean variable "stopParse" to consume the listeners since i don´t like to use throw new SAXException();

    private boolean stopParse;
    
    article.getChild("title").setEndTextElementListener(new EndTextElementListener(){
                public void end(String body) {
                    if(stopParse) {
                      return; //if stopParse is true consume the listener.
                    }
                    setTitle(body);
                }
            });
    

    Update:

    @PanuHaaramo, supossing to have this .xml

    <root>
            <article>
                   <title>Jorgesys</title>
            </article>
            <article>
                   <title>Android</title>
            </article>
            <article>
                   <title>Java</title>
            </article>
    </root>
    

    the parser to get the "title" value using android SAX must be:

       import android.sax.Element;
       import android.sax.EndTextElementListener;
       import android.sax.RootElement;
    ...
    ...
    ...
        RootElement root = new RootElement("root");
        Element article= root.getChild("article");
        article.getChild("title").setEndTextElementListener(new EndTextElementListener(){
                    public void end(String body) {
                        if(stopParse) {
                          return; //if stopParse is true consume the listener.
                        }
                        setTitle(body);
                    }
                });
    
    0 讨论(0)
  • 2020-11-27 08:00

    Create a specialization of a SAXException and throw it (you don't have to create your own specialization but it means you can specifically catch it yourself and treat other SAXExceptions as actual errors).

    public class MySAXTerminatorException extends SAXException {
        ...
    }
    
    public void startElement (String namespaceUri, String localName,
                               String qualifiedName, Attributes attributes)
                            throws SAXException {
        if (someConditionOrOther) {
            throw new MySAXTerminatorException();
        }
        ...
    }
    
    0 讨论(0)
提交回复
热议问题