SAX разбор в андроиде - PullRequest
1 голос
/ 08 июля 2010

У меня есть XML-файл, который выглядит следующим образом:

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

Я пытаюсь проанализировать его с помощью sax следующим образом:

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

Но мой список сообщений всегда пустмои сообщения журнала, которые находятся внутри endElement и startElement, никогда не отображаются.Как я могу проверить, получает ли программа XML-файл или я его неправильно анализирую?

Ответы [ 2 ]

1 голос
/ 08 июля 2010

Проблема заключалась в выражениях endElement и startElement if. Я должен проверять "if (localName.equalsIgnoreCase (" minus "))" вместо "if (localName.equalsIgnoreCase (" ax21: minus "))"

Я также добавил эту строку как предложено: mySAXParserFactory.setNamespaceAware (true);

0 голосов
/ 08 июля 2010

Если это ваш XML-файл, он поврежден (вы используете пространства имен ns и ax21, не объявляя их).Вы исключили пример XML?

Вы еще не пробовали SAX-разбор, но не думаете ли вы, что setNamespaceAware(true) может быть хорошей идеей?

Что касается проверки, рассматривали ли вы добавлениемодульный тестовый проект?Вы пытались пройти через код в Eclipse / ADT?

...