开发者

SAX parsing in android

开发者 https://www.devze.com 2023-01-06 14:55 出处:网络
I have xml file that looks like this: <ns:retrieveLastResponse> <ns:return xsi:type=\"ax21:MinusEntry\">

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?


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);


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?

0

精彩评论

暂无评论...
验证码 换一张
取 消