2014-09-04 4 views
0

Я анализирую XML с помощью SAXParser и пытаюсь получить значение для определенного узла, но мой код возвращает null. Я не знаю, что я делаю неправильно. вот мой код. Любая помощь будет принята с благодарностью.Null return from object using SAXParser - NullPointerException

import java.io.IOException; 
import java.io.StringReader; 

import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 

import org.xml.sax.Attributes; 
import org.xml.sax.InputSource; 
import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 

public class SAXParserUsage extends DefaultHandler { 

    SAXParserFactory factory; 
    SAXParser parser; 
    DefaultHandler handler; 
    private String elementName; 
    private String authorizationCode; 

    public String getAuthCodeResponse(String message) throws SAXException, IOException, ParserConfigurationException { 
    factory = SAXParserFactory.newInstance(); 
    handler = new SAXParserUsage(); 
    parser = factory.newSAXParser(); 
    parser.parse(new InputSource(new StringReader(message)), handler); 
    return authorizationCode; 
    } 

    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 
    elementName = qName; 
    } 

    public void characters(char[] text, int start, int length) throws SAXException { 
    if (elementName.equals("code")) { 
     String code = new String(text, start, length); 
     System.out.println("setting code: " + code); 
     authorizationCode = code; 
    } 

    } 

    public void endElement(String arg0, String arg1, String arg2) throws SAXException { 
    } 

    public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException { 
    SAXParserUsage usage = new SAXParserUsage(); 
    String code = usage.getAuthCodeResponse(getSampleString()); 
    System.out.println("code is: " + code); 
    } 

    private static String getSampleString() { 
    String sample = "<washCode><getCode><code>12345</code></getCode></washCode>"; 
    return sample; 
    } 

} 
+3

try 'return handler.authorizationCode' – Fildor

+0

@ Метод NathanHughes getAuthCodeResponse возвращает' Null', пока я устанавливаю значение для authorizationCode во время разбора – Ashish

+0

@Fildor Спасибо, сработало. – Ashish

ответ

1
public String getAuthCodeResponse(String message) throws SAXException, IOException,  ParserConfigurationException { 
factory = SAXParserFactory.newInstance(); 
handler = new SAXParserUsage(); // <--- You create local instance here 
parser = factory.newSAXParser(); 
parser.parse(new InputSource(new StringReader(message)), handler); 
// ^^ parser writes to local instance here but ... 
return authorizationCode; 
// you return authCode field of the instance that this method is invoked on, 
// which has not been changed by this method. 
// So if it was null before, it still is null. 
} 

Таким образом, вы должны либо return handler.authorizationCode или parser.parse(..., this);

0

Попробуйте возвращение

handler.authorizationCode;

вместо

return authorizationCode; 
1

Обратите также внимание на то, что вы не можете полагаться на содержимое элемента, передаваемого методу characters() в одной части. Его можно разделить на несколько вызовов метода characters(). Это не произойдет очень часто - обычно только в том случае, если текст содержит ссылки на сущности или пересекает границу между двумя буферами ввода-вывода, - но тот факт, что это редко, делает эту ошибку очень коварной. Вам нужно буферизировать содержимое по нескольким вызовам и сохранить его, когда вы нажмете событие endElement().

В вашем коде есть еще одна ошибка, заключающаяся в том, что анализатор не обязан предоставлять аргумент qName для startElement(), если свойство http://xml.org/sax/features/namespace-prefixes анализатора принимает значение по умолчанию «false». Тем не менее, я никогда не сталкивался с парсером, который не смог дать этот аргумент, поэтому этот вряд ли ударит вас на практике.

 Смежные вопросы

  • Нет связанных вопросов^_^