private GameSystem readGameSystem(ByteArrayInputStream inputStream) throws XmlException, IOException {
        final GameSystem gameSystem = new GameSystem();
        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.GAME_SYSTEM_TAG)) {
                        gameSystem.setId(attributes.getValue(DataConstants.ID_ATTRIBUTE));
                        gameSystem.setBattleScribeVersion(attributes.getValue(DataConstants.BATTLESCRIBE_VERSION_ATTRIBUTE));
                        gameSystem.setRevision(Integer.parseInt(attributes.getValue(DataConstants.REVISION_ATTRIBUTE)));
                        gameSystem.setName(attributes.getValue(DataConstants.NAME_ATTRIBUTE));
                        gameSystem.setAuthorName(attributes.getValue(DataConstants.AUTHOR_NAME_ATTRIBUTE));
                        gameSystem.setAuthorContact(attributes.getValue(DataConstants.AUTHOR_CONTACT_ATTRIBUTE));
                        gameSystem.setAuthorUrl(attributes.getValue(DataConstants.AUTHOR_URL_ATTRIBUTE));
                        throw new SAXParseCompleteException("DONE");
                    }
                }
            });
        }
        catch (ParserConfigurationException e) {
            throw new IllegalStateException(e);
        }
        catch (SAXParseCompleteException e) {
            return gameSystem;
        }
        catch (SAXException ex) {
            throw new XmlException(ex);
        }
        throw new XmlException("Invalid catalogue XML");
    }