public static Collection<Statistic> parse(File inFile)
      throws IOException, XmlPullParserException {
    Collection<Statistic> results = new ArrayList<Statistic>();
    FileInputStream fis = null;
    BufferedInputStream bis = null;
    try {
      fis = new FileInputStream(inFile);
      bis = new BufferedInputStream(fis);
      XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
      factory.setNamespaceAware(true);
      factory.setValidating(false);
      XmlPullParser parser = factory.newPullParser();
      parser.setInput(bis, null);

      // check that the first tag is <javancss>
      expectNextTag(parser, "javancss");

      // skip until we get to the <packages> tag
      while (parser.getDepth() > 0
          && (parser.getEventType() != XmlPullParser.START_TAG
              || !"packages".equals(parser.getName()))) {
        parser.next();
      }
      while (parser.getDepth() > 0
          && (parser.getEventType() != XmlPullParser.START_TAG
              || !"package".equals(parser.getName()))) {
        parser.next();
      }
      while (parser.getDepth() >= 2
          && parser.getEventType() == XmlPullParser.START_TAG
          && "package".equals(parser.getName())) {
        Map<String, String> data = new HashMap<String, String>();
        String lastTag = null;
        String lastText = null;
        int depth = parser.getDepth();
        while (parser.getDepth() >= depth) {
          parser.next();
          switch (parser.getEventType()) {
            case XmlPullParser.START_TAG:
              lastTag = parser.getName();
              break;
            case XmlPullParser.TEXT:
              lastText = parser.getText();
              break;
            case XmlPullParser.END_TAG:
              if (parser.getDepth() == 4 && lastTag != null && lastText != null) {
                data.put(lastTag, lastText);
              }
              lastTag = null;
              lastText = null;
              break;
          }
        }
        if (data.containsKey("name")) {
          Statistic s = new Statistic(data.get("name"));
          s.setClasses(Long.valueOf(data.get("classes")));
          s.setFunctions(Long.valueOf(data.get("functions")));
          s.setNcss(Long.valueOf(data.get("ncss")));
          s.setJavadocs(Long.valueOf(data.get("javadocs")));
          s.setJavadocLines(Long.valueOf(data.get("javadoc_lines")));
          s.setSingleCommentLines(Long.valueOf(data.get("single_comment_lines")));
          s.setMultiCommentLines(Long.valueOf(data.get("multi_comment_lines")));
          results.add(s);
        }
        parser.next();
      }

    } catch (XmlPullParserException e) {
      throw new IOException2(e);
    } finally {
      if (bis != null) {
        bis.close();
      }
      if (fis != null) {
        fis.close();
      }
    }
    return results;
  }