android,sax解析器重复错误

时间:2011-08-19 08:53:50

标签: android xml listview sax

我正在尝试解析一个中等大小的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元素,并逐渐添加其他元素。

我无法理解为什么会发生这种情况,请大家帮忙!

由于

1 个答案:

答案 0 :(得分:3)

解决此问题:

        boolean DayofWeek = false;
        String dayofweek = null; 

1)这完全令人困惑

2)变量应始终以小写字母开头

3)我不知道这是否会影响您的代码逻辑

尝试:

        boolean foundDayofWeek = false;
        String dayOfWeekText = null; 

参考:Java Naming Conventions

你的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();
  }

参考:OTT XML Parsing

为了清晰起见,方法也应该以小写字母开头(类名称是大写的)更改:

 AddObjectToList()

 addObjectToList();

看看我们是怎么走的。