我正在尝试解析一个中等大小的xml文件,将其存储在ArrayList中,然后在listview中显示结果。目前我遇到了问题,但找不到解决方案。首先,这是我的sax解析器代码:
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler() {
boolean DayofWeek = false;
boolean DateDD = false;
String dayofweek = null;
String datedd = null;
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println("Start Element :" + qName);
if (qName.equalsIgnoreCase("DayofWeek")) {
DayofWeek = true;
}
else if (qName.equalsIgnoreCase("Date-DD")) {
DateDD = true;
}
// ommited
}
public void endElement(String uri, String localName,String qName) throws SAXException {
}
public void characters(char ch[], int start, int length) throws SAXException {
if (DayofWeek) {
System.out.println(new String(ch,start,length));
dayofweek = new String(ch, start, length);
DayofWeek = false;
}
else if (DateDD) {
System.out.println(new String(ch,start,length));
datedd = new String(ch, start, length);
DateDD = false;
}
// ommited
else if (dayofweek != null) {
System.out.println("Do i reach here?");
addElement(dayofweek, datedd, datemm, dateyy, time, competition, home, away, venue); //is run
}
}
};
saxParser.parse(is, handler);
} catch (Exception e) {
System.out.println("Sax Error");
Log.w("SaxError", e);
}
}
private void addElement(String dayofweek, String datedd, String datemm, String dateyy, String time, String competition, String home, String away, String venue) {
System.out.println("Add Element");
AddObjectToList(dayofweek, datedd);
}
// Add one item into the Array List
public void AddObjectToList(String dayofweek, String datedd, String datemm, String dateyy, String time, String competition, String home, String away, String venue) {
System.out.println("AddObjectToList");
fixture = new FixtureSupport();
fixture.setDayOfWeek(dayofweek);
fixture.setDateDD(datedd);
itemList.add(fixture);
}
在logcat中,这将正确打印所有信息,但没有任何内容会进入AddElement文档,因此listview中不会显示任何内容。然而,如果我要将所有'else if'语句更改为'if'语句,代码将在listview中打印出来,但每个XML元素将重复大约10次左右(似乎是随机的)。虽然它也会重复,但它一次只打印一个xml元素,并逐渐添加其他元素。
我无法理解为什么会发生这种情况,请大家帮忙!
由于
答案 0 :(得分:3)
解决此问题:
boolean DayofWeek = false;
String dayofweek = null;
1)这完全令人困惑
2)变量应始终以小写字母开头
3)我不知道这是否会影响您的代码逻辑
尝试:
boolean foundDayofWeek = false;
String dayOfWeekText = null;
你的characters()方法需要附加到StringBuffer,并不是所有的字符都可以一次发送,所以你必须继续追加你在缓冲区调用.toString的endElement()方法。
// Pseudo
Stringbuffer yourStringBuffer;
startElement() {
yourStringBuffer = new Stringbuffer();
}
public void characters(char[] ch, int start, int length) {
yourStringBuffer.append(ch, start, start + length);
}
endElement() {
// If ....
String elementText = yourStringBuffer.toString();
}
为了清晰起见,方法也应该以小写字母开头(类名称是大写的)更改:
AddObjectToList()
到
addObjectToList();
看看我们是怎么走的。