tags:

views:

99

answers:

2

Hello!

I have xml file that looks like this:

 <ns:retrieveLastResponse>
 <ns:return xsi:type="ax21:MinusEntry">
 <ax21:entrydate>2010-07-02T17:29:35.492+02:00</ax21:entrydate>
 <ax21:minus>true</ax21:minus> 
 <ax21:password>SECRET</ax21:password> 
 <ax21:text>Some text</ax21:text>
<ax21:username>John Doe</ax21:username>
 </ns:return>
</ns:retrieveLastResponse>

I'm trying to parse it with sax like this:

try {

        URL rssUrl = new URL("ADDRESS OF WS THAT RETURNS XML FILE"); 
        SAXParserFactory mySAXParserFactory = SAXParserFactory.newInstance();
        SAXParser mySAXParser = mySAXParserFactory.newSAXParser();
        XMLReader myXMLReader = mySAXParser.getXMLReader();
        RSSHandler myRSSHandler = new RSSHandler();
        myXMLReader.setContentHandler(myRSSHandler);
        InputSource myInputSource = new InputSource(rssUrl.openStream());
        //InputSource myInputSource = new InputSource(rssUrl.openConnection().getInputStream());
        myXMLReader.parse(myInputSource);

        //result.setText(myRSSHandler.getMessages().get(0).getDesc());
        result.setText(Integer.toString(myRSSHandler.getMessages().size()));

    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        result.setText("Cannot connect RSS!");
    } catch (ParserConfigurationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        result.setText("Cannot connect RSS!");
    } catch (SAXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        result.setText("Cannot connect RSS!");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        result.setText("Cannot connect RSS!");
    }


}

private class RSSHandler extends DefaultHandler
{

    private List<Message> messages;     
    private Message currentMessage;
    private StringBuilder builder;


    public List<Message> getMessages(){
        return this.messages;
    }

    @Override
    public void startDocument() throws SAXException {

        messages = new ArrayList<Message>();
        builder = new StringBuilder();
    }

    @Override
    public void endDocument() throws SAXException {
        // TODO Auto-generated method stub

    }

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

        super.startElement(uri, localName, qName, attributes);

        // TODO Auto-generated method stub
        if (localName.equalsIgnoreCase("ns:return")){
            Log.d("XML","Zacetek xmla");
            this.currentMessage = new Message();
        }

    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {

        super.endElement(uri, localName, qName);

        if (this.currentMessage != null){
            if (localName.equalsIgnoreCase("ax21:entrydate")){
                Log.d("XML","Vstop v datum");
                currentMessage.setDate(builder.toString());

            } else if (localName.equalsIgnoreCase("ax21:minus")){
                currentMessage.setMin(builder.toString());
            } else if (localName.equalsIgnoreCase("ax21:text")){
                currentMessage.setDesc(builder.toString());
            } else if (localName.equalsIgnoreCase("ax21:username")){
                currentMessage.setUser(builder.toString());
            }
            else if(localName.equalsIgnoreCase("ns:return")){
                messages.add(currentMessage);               
            }
            builder.setLength(0);             
        }

        }



    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        // TODO Auto-generated method stub
        super.characters(ch, start, length);

        builder.append(ch, start, length);
    }

But my list of messages is always empty, my log messages that are inside endElement and startElement are never displayed. How can i check if the program gets the xml file at all or am i parsing it incorectly?

A: 

If that's your XML file, it's malformed (you're using namespaces ns and ax21 without declaring them). Have you elided the XML example?

Haven't tried SAX parsing myself yet, but don't you think setNamespaceAware(true) might be a good idea?

As for checking, have you considered adding a unit test project? Have you tried stepping through the code in Eclipse/ADT?

Pontus Gagge
Sorry i omited the beginning of xml file, it looks like this:<ns:retrieveLastResponse xmlns:ns="http://ws.minus.mandm.si" xmlns:ax21="http://ws.minus.mandm.si/xsd"><ns:return xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ax21:MinusEntry"><ax21:entrydate>2010-07-08T00:27:38.520+02:00</ax21:entrydate><ax21:minus>true</ax21:minus><ax21:password>SECRET</ax21:password><ax21:text>TSLA ipo, quite fail</ax21:text><ax21:username>John Doe</ax21:username></ns:return>
DixieFlatline
I enter startDocument and endDocument but nothing else?!
DixieFlatline
+1  A: 

The problem was in endElement and in startElement if clauses. I should be chekcking for "if (localName.equalsIgnoreCase("minus"))" instead of "if (localName.equalsIgnoreCase("ax21:minus"))"

I also added this line as suggested: mySAXParserFactory.setNamespaceAware(true);

DixieFlatline