Разбор xml: attribute.getValue () возвращает ноль? - PullRequest
0 голосов
/ 09 декабря 2011

Посмотрите эту часть моего xml:

<blocktype>
    <properties name="normal_blue" type="1"/>
    <resources image="brick_blue"/>
    <properties powerup="0" shield="0" />
</blocktype>

Я использую этот код для его анализа:

@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {

    if (localName.equalsIgnoreCase("level")) {
        block = null;
        inLevel = true; // parsing level
        Log.d("MyContentHandler", "Parsing Level = " + Boolean.toString(inLevel));
    } if (localName.equalsIgnoreCase("blocktype")) {
        bundle = null;
        inBlockType = true; // parsing blocktype
        Log.d("MyContentHandler", "Parsing blocktype = " + Boolean.toString(inBlockType));
    };

    // handling level parsing
    if (inLevel) {
        int n = 0;
        if (localName.equalsIgnoreCase("properties")) {
                int c = Integer.parseInt(attributes.getValue("columns"));
                int r = Integer.parseInt(attributes.getValue("rows"));
                bundle = new XmlLevelBundle(r, c);
                bundle.name = attributes.getValue("name");
            }// bundle might be null?
            if (localName.equalsIgnoreCase("block")) {
                bundle.types[n] = Integer.parseInt(attributes.getValue("type"));
                n++;
            }
    }

    // handling BlockType parsing
    if (inBlockType) {

        if (localName.equalsIgnoreCase("properties")) {
            block.name = attributes.getValue("name");
            block.type = Integer.parseInt(attributes.getValue("type")); //nullpointer?
        } else if (localName.equalsIgnoreCase("resources")) {
            block.resourceName = attributes.getValue("image");
        } else if (localName.equalsIgnoreCase("properties")) {
            block.powerUp = Integer.parseInt(attributes.getValue("powerup"));
            block.shield = Integer.parseInt(attributes.getValue("shield"));
        }
    }
}

Теперь все работает, когда я убираю второе утверждение,Как вы можете видеть, мой xml на самом деле имеет атрибут type, но он возвращает ноль в соответствии со следующим logcat:

12-09 18: 53: 30.741: WARN / System.err (851): java.lang.NumberFormatException: невозможно проанализировать 'null' как целое число 12-09 18: 53: 30.769: WARN / System.err (851): at java.lang.Integer.parseInt (Integer.java:406) 12-09 18: 53: 30.769: WARN / System.err (851): на java.lang.Integer.parseInt (Integer.java:382) 12-09 18: 53: 30.779: WARN / System.err (851):at cd.ark.utils.MyContentHandler.startElement (MyContentHandler.java:57)

... (извините за форматирование)

Так что в основном он говорит, что Null передается в Integer.parseInt ().

Так кто-нибудь может мне помочь с этим NullPointerException?Я застрял на этом в течение длительного времени.Спасибо!

1 Ответ

1 голос
/ 09 декабря 2011

Так как один из тегов является "saxparser", я предполагаю, что это то, что вы используете. В этом случае вызовы методов кажутся правильными, и проблема в том, что attributes не правильно инициализируется значениями, содержащимися в вашем XML. Пожалуйста, добавьте код, чтобы показать, как вы генерируете attributes.

РЕДАКТИРОВАТЬ: Проблема, вероятно, в том, что

attributes.getValue("rows")

возвращает ноль, поскольку вы не используете квалифицированных имен в своем XML; см. документацию к библиотеке SAX , в частности документацию Attributes.getValue (String) . Если вы используете Attributes.getValue(String) и квалифицированные имена недоступны, будет возвращено null.

Полезное, но краткое объяснение квалифицированных имен в SO можно найти здесь .

EDIT2: Я не знаю, как правильно настроить XML (сам никогда не использовал XML), но вам не нужно использовать пространства имен, вы можете делать то, что вы хотите, используя Attributes.getValue(int), поскольку это работает не с именами атрибутов, а с списком атрибутов, которые он содержит. Вам, вероятно, нужно выяснить порядок атрибутов; Вы можете понять это следующим образом:

for(int i = 0; i < attributes.getLength(); i++) {
    System.out.println(attributes.getValue(i));
}

Надеюсь, это поможет; возможно вы можете найти что-то полезное в пространствах имен в XML для SO; в противном случае, если ваша программа требует использования атрибутов адресации по их именам, вам, вероятно, придется узнать о пространствах имен XML.

...