public void startElement(final String uri, final String localName, final String qName, final Attributes attributes)
        throws SAXException
    {
        final String name = qName;
        if ((name == null) || (name.length() == 0))
        {
            // it is not allowed for the name to not exist
            fatalError(new SAXParseException("name field not specified in card field", locator));
        }

        if (name.equals(ELEMENT_CARDS))
        {
        }
        else if (name.equals(ELEMENT_CARD))
        {
            // make a card. This will receive all the data
            final DeckData.Card card = DeckData.createBlankCard();

            final String cardName = attributes.getValue(ATTRIBUTE_NAME);
            if (cardName == null)
            {
                card.m_cardName = "";
            }
            else
            {
                card.m_cardName = cardName;
            }

            final String cardFile = attributes.getValue(ATTRIBUTE_FILE);
            if (cardFile == null)
            {
                card.m_cardFile = "";
            }
            else
            {
                card.m_cardFile = cardFile;
            }

            final String cardDesc = attributes.getValue(ATTRIBUTE_DESC);
            if (cardDesc == null)
            {
                card.m_cardDesc = "";
            }
            else
            {
                card.m_cardDesc = cardDesc;
            }

            final String qtyStr = attributes.getValue(ATTRIBUTE_QTY);

            int qty = 0;
            try
            {
                qty = Integer.parseInt(qtyStr);
            }
            catch (final Exception e)
            {
                // there was a problem parsing the int. this is not allowed
                error(new SAXParseException("invalid or missing " + ATTRIBUTE_QTY + " field", locator));
            }

            card.m_quantityInDeck = qty;

            // only add this card type if there is at least 1 of them in the deck
            if (qty < 0)
            {
                // a quantity of 0 or less is not allowed
                error(new SAXParseException("invalid or missing " + ATTRIBUTE_QTY + " field", locator));
            }
            m_deckData.addCardType(card);
        }
    }