【问题标题】:android, sax parser duplication errorandroid,sax解析器重复错误
【发布时间】:2011-08-19 08:53:50
【问题描述】:

我正在尝试解析一个中等大小的 xml 文件,将其存储在 ArrayList 中,然后在列表视图中显示结果。目前我遇到了问题,但找不到解决方案。首先这是我的 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 文档,因此列表视图中不会出现任何内容。然而,如果我将所有“else if”语句更改为“if”语句,代码将在列表视图中打印出来,但每个 XML 元素将重复大约 10 次左右(似乎是随机的)。虽然它也会重复自身,但它一次只打印一个 xml 元素,然后逐渐将其他元素添加到其中。

我不明白为什么会这样,请大家帮忙!

谢谢

【问题讨论】:

  • 将 else if (dayofweek != null) 替换为 if (dayofweek != null)
  • 这允许它显示在列表视图中,这很好,但复制仍在发生。 :-(
  • 这是因为您的列表具有重复值,因此在将项目列表传递给适配器之前,请删除重复项。
  • 当您说重复时,在 XML 文件本身中重复?

标签: android xml listview sax


【解决方案1】:

修复此问题:

        boolean DayofWeek = false;
        String dayofweek = null; 

1) 完全令人困惑

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

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

试试:

        boolean foundDayofWeek = false;
        String dayOfWeekText = null; 

参考:Java Naming Conventions

您的 characters() 方法需要附加到 StringBuffer,并非所有字符都可以一次发送,因此您必须在 endElement() 方法中继续附加,然后在缓冲区上调用 .toString。

  // 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();

看看我们如何从那里开始。

【讨论】:

  • 谢谢,目前正在进行一些更改! :)
  • anddev.org/… 是一篇不错的 Android 文章,尽管它存在 characters() 问题
  • 好的,我已经完成了更改,但同样的问题仍然存在。 XML 总共有 9 个我需要的元素。我需要 1 个还是 9 个 StringBuffers?
  • 1 所以在 endElement 中,你将它设置为你在 char 中所做的任何事情,并在 startElement 中重新实例化它,即 new StringBuffer();然后,这会将您的 addElement() 调用移动到 endElement() 中,这更有意义:-)
  • 字符串缓冲区似乎没有什么不同!
猜你喜欢
  • 1970-01-01
  • 2013-01-02
  • 2013-12-05
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 2013-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多