如何限制在SAX解析器处理程序类中调用'startElement()'的次数?

时间:2013-01-26 12:31:49

标签: java xml sax

我使用SAX解析XML&从中获取元素数量。

在XML中,存在<item>个标签次数(很容易> 50)。但是我只想在20年前拿到它。

调用XMLHanlder的代码:

XMLHandler handler = new XMLHandler();
xmlReader.setContentHandler(handler);
xmlReader.parse(new InputSource(in));

XMLHandler代码:

public class XMLHanlder extends DefaultHandler {

    @Override
    public void startDocument() throws SAXException {
    ...
    }

    @Override
    public void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {
    ...
    }


    @Override
    public void endElement(String uri, String localName, String qName)
        throws SAXException {
    ...
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
    ...
    }
}

是否有任何方法startElement()/endElement()不会被调用超过20次。

如果没有,是否有任何解决方法?

由于

2 个答案:

答案 0 :(得分:3)

SAX不提供任何此类功能。解决方法只是使用计数器:

public class XMLHandler extends DefaultHandler {

   private int counter = 0;

   @Override
   public void startElement(String uri, String localName, String qName,
                                       Attributes attributes) throws SAXException {

      if (counter < 20) {
            ...
      } else {
         return;
      }
    }

   @Override
   public void endElement(String uri, String localName, String qName)
                                                    throws SAXException {
      counter++;
      ....
   }
   ...
} 

这里可选的是对0显式分配计数器值(默认情况下将采用该值)。

答案 1 :(得分:1)

按其他人的建议添加计数器。但是,您可以通过从ContentHandler中抛出SAXException来中止解析。这将被传递回调用parse()的应用程序,该应用程序可以捕获异常,检查它以区别于真正的解析错误,然后继续正常。