public Schedule parse() throws ParserException {
    try {
      List<Day> days = new ArrayList<Day>();
      Event event = null;
      List<Event> events = null;
      List<Room> rooms = null;
      Conference conference = null;

      Day day = null;
      Room room = null;

      XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
      factory.setNamespaceAware(true);
      XmlPullParser xpp = factory.newPullParser();

      xpp.setInput(stream, "UTF-8");

      @SuppressWarnings("unused")
      String content = null;

      int eventType = xpp.getEventType();
      while (eventType != XmlPullParser.END_DOCUMENT) {
        if (eventType == XmlPullParser.START_TAG) {
          launchEvent(xpp.getName(), ParserEventListener.TAG_OPEN);
          if (xpp.getName().equals(CONFERENCE)) {
            xpp.next();
            conference = parseConference(xpp);
          } else if (xpp.getName().equals(DAY)) {
            Date date = null;
            int idx = 0;
            for (int i = 0; i < xpp.getAttributeCount(); i++) {
              if (xpp.getAttributeName(i).equals(DATE)) {
                date = DateUtil.getDate(xpp.getAttributeValue(i));
              } else if (xpp.getAttributeName(i).equals(INDEX)) {
                idx = Integer.parseInt(xpp.getAttributeValue(i));
              }
            }
            day = new Day(date, idx);
            rooms = new ArrayList<Room>();

          } else if (xpp.getName().equals(ROOM)) {
            String name = null;
            for (int i = 0; i < xpp.getAttributeCount(); i++) {
              if (xpp.getAttributeName(i).equals(NAME)) {
                name = xpp.getAttributeValue(i);
              }
            }
            room = new Room(name);
            events = new ArrayList<Event>();
          } else if (xpp.getName().equals(EVENT)) {
            int id = -1;
            for (int i = 0; i < xpp.getAttributeCount(); i++) {
              if (xpp.getAttributeName(i).equals(ID)) {
                id = Integer.parseInt(xpp.getAttributeValue(i));
              }
            }
            xpp.next();
            Event e = parseEvent(xpp, day);
            e.setId(id);
            room.addEvent(e);
          }
          content = null;
        } else if (eventType == XmlPullParser.END_TAG) {
          launchEvent(xpp.getName(), ParserEventListener.TAG_CLOSED);
          if (xpp.getName().equals(DAY)) {
            day.addRooms(rooms);
            days.add(day);
            rooms = null;
          } else if (xpp.getName().equals(ROOM)) {
            room.addEvents(events);
            rooms.add(room);
            events = null;
          } else if (xpp.getName().equals(EVENT)) {
            events.add(event);
            event = null;
          }
        } else if (eventType == XmlPullParser.TEXT) {
          content = xpp.getText();
        }
        eventType = xpp.next();
      }
      return new Schedule(conference, days);
    } catch (Exception e) {
      throw new ParserException(e);
    }
  }
  public Event parseEvent(XmlPullParser xpp, Day day)
      throws XmlPullParserException, IOException, ParseException {
    // Log.v(getClass().getName(),day.getDate().toString());
    String content = null;
    int eventType = xpp.getEventType();
    Event event = new Event();
    while (eventType != XmlPullParser.END_DOCUMENT) {
      if (eventType == XmlPullParser.START_TAG) {
        launchEvent(xpp.getName(), ParserEventListener.TAG_OPEN);
        if (xpp.getName().equals(EVENT)) {
          int id = 0;
          for (int i = 0; i < xpp.getAttributeCount(); i++) {
            if (xpp.getAttributeName(i).equals(ID)) {
              id = Integer.parseInt(xpp.getAttributeValue(i));
            }
          }
          event.setId(id);
        } else if (xpp.getName().equals(PERSONS)) {
          ArrayList<Person> persons = parsePersons(xpp);
          event.setPersons(persons);
        }
        content = null;
      } else if (eventType == XmlPullParser.END_TAG) {
        launchEvent(xpp.getName(), ParserEventListener.TAG_CLOSED);
        if (xpp.getName().equals(START)) {
          Date d = (Date) day.getDate().clone();
          d.setHours(Integer.parseInt(content.substring(0, 2)));
          d.setMinutes(Integer.parseInt(content.substring(3, 5)));
          d.setSeconds(0);

          event.setStart(d);
          event.setDayindex(day.getIndex());
        } else if (xpp.getName().equals(DURATION)) {
          event.setDuration(DateUtil.convertStringToMinutes(content));
        } else if (xpp.getName().equals(ROOM)) {
          event.setRoom(content);
        } else if (xpp.getName().equals(TAG)) {
          event.setTag(content);
        } else if (xpp.getName().equals(TITLE)) {
          event.setTitle(content.trim());
        } else if (xpp.getName().equals(SUBTITLE)) {
          event.setSubtitle(content);
        } else if (xpp.getName().equals(TRACK)) {
          event.setTrack(content);
        } else if (xpp.getName().equals(TYPE)) {
          event.setType(content);
        } else if (xpp.getName().equals(LANGUAGE)) {
          event.setLanguage(content);
        } else if (xpp.getName().equals(ABSTRACT)) {
          event.setAbstract_description(content);
        } else if (xpp.getName().equals(DESCRIPTION)) {
          event.setDescription(content);
        } else if (xpp.getName().equals(EVENT)) {
          return event;
        }
      } else if (eventType == XmlPullParser.TEXT) {
        content = xpp.getText();
      }
      eventType = xpp.next();
    }
    return null;
  }