Android, ошибка дублирования саксофонного парсера - PullRequest
1 голос
/ 19 августа 2011

Я пытаюсь проанализировать умеренно большой XML-файл, сохранить его в ArrayList, а затем отобразить результаты в виде списка. В настоящее время у меня есть проблема, но я не могу найти решение. Во-первых, вот мой код синтаксического анализатора:

     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, и постепенно к нему добавляются другие элементы.

Я не могу понять, почему это происходит, любая помощь, пожалуйста, ребята!

Спасибо

1 Ответ

3 голосов
/ 19 августа 2011

Исправить эту проблему:

        boolean DayofWeek = false;
        String dayofweek = null; 

1) Это полностью сбивает с толку

2) переменные всегда должны начинаться со строчной буквы

3) Понятия не имею, влияет ли это на логику вашего кода

Попробуйте:

        boolean foundDayofWeek = false;
        String dayOfWeekText = null; 

Ссылка: Соглашения об именах Java

Ваш метод 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();
  }

Ссылка: Анализ XML OTT

Методы также должны начинаться со строчной буквы для ясности (имена классов пишутся заглавными буквами):

 AddObjectToList()

до

 addObjectToList();

и посмотрим, как мы пойдем оттуда.

...