public JSONObject parseUserAnimeListXML(InputStream inputXML) throws MALException, IOException {
		// My storage variables
		final ArrayList<Anime> myAnime = new ArrayList<Anime>();
		final JSONObject animeListData = new JSONObject();
		final Anime currentAnime = new Anime();
		final User currentUser = new User();
		
		// XML nodes to detect
		RootElement root = new RootElement(MYANIMELIST);
		Element anime = root.getChild(ANIME);
		Element user = root.getChild(MYINFO);
		
		// Set parse events for myinfo node
		user.getChild(USER_ID).setEndTextElementListener(new EndTextElementListener() {
			public void end(String body) {
				currentUser.setId(Integer.parseInt(body));
			}
		});
		user.getChild(USER_NAME).setEndTextElementListener(new EndTextElementListener() {
			public void end(String body) {
				currentUser.setName(body);
			}
		});
		user.getChild(USER_WATCHING).setEndTextElementListener(new EndTextElementListener() {
			public void end(String body) {
				currentUser.setAnimeWatching(Integer.parseInt(body));
			}
		});
		user.getChild(USER_COMPLETED).setEndTextElementListener(new EndTextElementListener() {
			public void end(String body) {
				currentUser.setAnimeCompleted(Integer.parseInt(body));
			}
		});
		user.getChild(USER_ONHOLD).setEndTextElementListener(new EndTextElementListener() {
			public void end(String body) {
				currentUser.setAnimeOnhold(Integer.parseInt(body));
			}
		});
		user.getChild(USER_DROPPED).setEndTextElementListener(new EndTextElementListener() {
			public void end(String body) {
				currentUser.setAnimeDropped(Integer.parseInt(body));
			}
		});
		user.getChild(USER_PLANTOWATCH).setEndTextElementListener(new EndTextElementListener() {
			public void end(String body) {
				currentUser.setAnimePlanToWatch(Integer.parseInt(body));
			}
		});
		user.getChild(USER_DAYS_SPENT_WATCHING).setEndTextElementListener(new EndTextElementListener() {
			public void end(String body) {
				currentUser.setAnimeDaysSpentWatching(Double.parseDouble(body));
			}
		});
		
		// Set parse events for anime node
		anime.setEndElementListener(new EndElementListener() {
			public void end() {
				myAnime.add(currentAnime.copy());
			}
		});
		anime.getChild(SERIES_ANIMEDB_ID).setEndTextElementListener(new EndTextElementListener() {
			public void end(String body) {
				currentAnime.setId(Integer.parseInt(body));
			}
		});
		anime.getChild(SERIES_TITLE).setEndTextElementListener(new EndTextElementListener() {
			public void end(String body) {
				currentAnime.setTitle(body);
			}
		});
		anime.getChild(SERIES_SYNONYMS).setEndTextElementListener(new EndTextElementListener() {
			public void end(String body) {
				if(body.equals("")) {
					currentAnime.setSynonyms(new String[0]);
				} else {
					currentAnime.setSynonyms(body.split(";\\s"));
				}
			}
		});
		anime.getChild(SERIES_TYPE).setEndTextElementListener(new EndTextElementListener() {
			public void end(String body) {
				currentAnime.setType(Integer.parseInt(body));
			}
		});
		anime.getChild(SERIES_EPISODES).setEndTextElementListener(new EndTextElementListener() {
			public void end(String body) {
				currentAnime.setEpisodes(Integer.parseInt(body));
			}
		});
		anime.getChild(SERIES_STATUS).setEndTextElementListener(new EndTextElementListener() {
			public void end(String body) {
				currentAnime.setStatus(Integer.parseInt(body));
			}
		});
		anime.getChild(SERIES_START).setEndTextElementListener(new EndTextElementListener() {
			public void end(String body) {
				if(body.equals("0000-00-00") == false) {
					currentAnime.setStart(Date.valueOf(body));
				}
			}
		});
		anime.getChild(SERIES_END).setEndTextElementListener(new EndTextElementListener() {
			public void end(String body) {
				if(body.equals("0000-00-00") == false) {
					currentAnime.setEnd(Date.valueOf(body));
				}
			}
		});
		anime.getChild(SERIES_IMAGE).setEndTextElementListener(new EndTextElementListener() {
			public void end(String body) {
				currentAnime.setImageUrl(body);
			}
		});
		anime.getChild(MY_ID).setEndTextElementListener(new EndTextElementListener() {
			public void end(String body) {
				currentAnime.setUserListId(Integer.parseInt(body));
			}
		});
		anime.getChild(MY_WATCHED_EPISODES).setEndTextElementListener(new EndTextElementListener() {
			public void end(String body) {
				currentAnime.setUserEpisodesWatched(Integer.parseInt(body));
			}
		});
		anime.getChild(MY_START_DATE).setEndTextElementListener(new EndTextElementListener() {
			public void end(String body) {
				if(body.equals("0000-00-00") == false) {
					currentAnime.setUserStart(Date.valueOf(body));
				}
			}
		});
		anime.getChild(MY_FINISH_DATE).setEndTextElementListener(new EndTextElementListener() {
			public void end(String body) {
				if(body.equals("0000-00-00") == false) {
					currentAnime.setUserFinish(Date.valueOf(body));
				}
			}
		});
		anime.getChild(MY_SCORE).setEndTextElementListener(new EndTextElementListener() {
			public void end(String body) {
				currentAnime.setUserScore(Integer.parseInt(body));
			}
		});
		anime.getChild(MY_STATUS).setEndTextElementListener(new EndTextElementListener() {
			public void end(String body) {
				final int userStatus = Integer.parseInt(body);
				currentAnime.setPreviousUserStatus(userStatus);
				currentAnime.setUserStatus(userStatus);
			}
		});
		anime.getChild(MY_REWATCHING).setEndTextElementListener(new EndTextElementListener() {
			public void end(String body) {
				if(body.equals("1")) {
					currentAnime.setUserEnableRewatching(true);
				} else {
					currentAnime.setUserEnableRewatching(false);
				}
			}
		});
		anime.getChild(MY_LAST_UPDATED).setEndTextElementListener(new EndTextElementListener() {
			public void end(String body) {
				currentAnime.setUserLastUpdated(body);
			}
		});
		anime.getChild(MY_TAGS).setEndTextElementListener(new EndTextElementListener() {
			public void end(String body) {
				currentAnime.setUserTags(body);
			}
		});
		
		try {
			Xml.parse(inputXML, Xml.Encoding.UTF_8, root.getContentHandler());
			animeListData.put("user", currentUser);
			animeListData.put("anime", myAnime);
		} catch (Exception e) {
			throw new MALException(e);
		} finally {
			if(inputXML != null)
				inputXML.close();
		}
		
		return animeListData;
	}