2010-07-08 2 views
1

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

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

Я пытаюсь разобрать его с саксофоном, как это:

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-файл или я разбираюсь в нем без проблем?

+1

hmmmmm ..... андроид есть sax? hmmmm ...... –

+0

Это там http://developer.android.com/intl/de/reference/android/sax/package-summary.html – Pentium10

+0

Вы пытались переместить строку Log.d из инструкции if ? Или поместите несколько символов в функцию символов, чтобы распечатать символы, чтобы проверить, что вы что-то читаете. –

ответ

1

Проблема была в endElement и в startElement if clauses. Я должен быть chekcking для "если (localName.equalsIgnoreCase (" минус "))" вместо "если (localName.equalsIgnoreCase (" ax21: минус "))"

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

0

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

Не пробовал SAX еще раз разбираться, но как вам кажется, setNamespaceAware(true) может быть хорошей идеей?

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

+0

Извините, я пропустил начало файла xml, это выглядит так: 2010-07-08T00: 27: 38,520 + 02: 00 правда SECRET TSLA фо, совершенно не в состоянии John Doe DixieFlatline

+0

Я введите StartDocument и EndDocument, но ничего другого ?! – DixieFlatline

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