private Roster readRoster(ByteArrayInputStream inputStream) throws XmlException, IOException {
        final Roster roster = new Roster();
        try {
            SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
            saxParser.parse(inputStream, new DefaultHandler() {
                @Override
                public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
                    if (qName.equalsIgnoreCase(DataConstants.ROSTER_TAG)) {
                        roster.setBattleScribeVersion(attributes.getValue(DataConstants.BATTLESCRIBE_VERSION_ATTRIBUTE));
                        roster.setDescription(attributes.getValue(DataConstants.DESCRIPTION_ATTRIBUTE));
                        roster.setName(attributes.getValue(DataConstants.NAME_ATTRIBUTE));
                        roster.setPoints(Double.parseDouble(attributes.getValue(DataConstants.POINTS_ATTRIBUTE)));
                        roster.setPointsLimit(Double.parseDouble(attributes.getValue(DataConstants.POINTS_LIMIT_ATTRIBUTE)));
                        roster.setGameSystemId(attributes.getValue(DataConstants.GAME_SYSTEM_ID_ATTRIBUTE));
                        
                        if (attributes.getIndex(DataConstants.GAME_SYSTEM_NAME_ATTRIBUTE) >= 0) {
                            roster.setGameSystemName(attributes.getValue(DataConstants.GAME_SYSTEM_NAME_ATTRIBUTE));
                        }
                        if (attributes.getIndex(DataConstants.GAME_SYSTEM_REVISION_ATTRIBUTE) >= 0) {
                            roster.setGameSystemRevision(
                                    Integer.parseInt(attributes.getValue(DataConstants.GAME_SYSTEM_REVISION_ATTRIBUTE)));
                        }
                        
                        throw new SAXParseCompleteException("DONE");
                    }
                }
            });
        }
        catch (ParserConfigurationException e) {
            throw new IllegalStateException(e);
        }
        catch (SAXParseCompleteException e) {
            return roster;
        }
        catch (SAXException ex) {
            throw new XmlException(ex);
        }
        throw new XmlException("Invalid roster XML");
    }