Как прекратить анализ XML-документа с SAX в любое время? - PullRequest
24 голосов
/ 28 августа 2009

Я анализирую большой XML-документ с помощью Sax. Я хочу прекратить анализ документа, когда какое-либо условие устанавливается? Как это сделать?

Ответы [ 3 ]

39 голосов
/ 28 августа 2009

Создайте специализацию SAXException и выбросьте ее (вам не нужно создавать свою собственную специализацию, но это означает, что вы можете специально отловить ее самостоятельно и рассматривать другие SAXException как реальные ошибки).

public class MySAXTerminatorException extends SAXException {
    ...
}

public void startElement (String namespaceUri, String localName,
                           String qualifiedName, Attributes attributes)
                        throws SAXException {
    if (someConditionOrOther) {
        throw new MySAXTerminatorException();
    }
    ...
}
4 голосов
/ 28 августа 2009

Мне не известен механизм прерывания синтаксического анализа SAX, отличный от техники выброса исключений , описанной Томом . Альтернативой является переключение на использование синтаксического анализатора StAX (см. pull против push ).

2 голосов
/ 21 февраля 2014

Я использую логическую переменную "stopParse" для приема слушателей, так как я не люблю использовать 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);
            }
        });

Обновление:

@ PanuHaaramo, возможно, это будет .xml

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

синтаксический анализатор для получения значения "title" с использованием android SAX должен быть:

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