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?
精彩评论