0

我使用 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 次。

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

谢谢

4

2 回答 2

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(默认情况下将采用该值)。

于 2013-01-26T12:35:49.997 回答
1

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

于 2013-01-26T15:33:18.647 回答