Проблема Android с массивом объектов в SAX-анализаторе

#android #xml #arraylist #saxparser

#Android #xml #список массивов #saxparser

Вопрос:

Я пытаюсь проанализировать XML-страницу, которая построена следующим образом: http://pastebin.com/t9cXdnGs . Я внедрил базовый синтаксический анализатор SAX, следуя этому руководству: Anddev SAX tutorial.

Это сработало довольно хорошо, за исключением того, что я получаю значения только последнего тега. Чтобы решить это, я реализовал ArrayList для добавления каждого созданного объекта на узел XML. Но теперь я получаю какой-то странный вывод. Для каждого узла, который он передает в цикле, он снова добавляет то же значение. Итак, для узла 1 я получаю значение один раз, для узла 2 я получаю значение дважды и так далее… (пример: значение 1, значение 2value2, значение 3value3value3)

Кажется, я не могу понять, что не так…

Вот мой полный исходный код страницы:http://pastebin.com/bkyz0g1U

Ответ №1:

Вы повторно используете один и тот же объект снова и снова, поэтому вы добавляете только один объект в свой ArrayList . Замените эту строку:

 private Vacature vacature = new Vacature();
  

с

 private Vacature vacature;
  

и добавьте эту строку:

 vacature = new Vacature();
  

сразу после вашего объявления characters() метода:

 public void characters(char ch[], int start, int length) {
  

Я также подозреваю, что это getVacatures() должно вернуть ArrayList arrayVaca .

Ответ №2:

Я быстро изменил ваш код на более простое решение:

     package stage.accent.webservice;

import java.util.ArrayList;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import stage.accent.domain.Vacature;

public class vacatureWebservice extends DefaultHandler {



        private ArrayList<Vacature>arrayVaca = new ArrayList<Vacature>();

        private Vacature vacature = null;

        public ArrayList<Vacature> getVacatures() {
            return this.arrayVaca;

        }

        public StringBuilder buff =  new StringBuilder();

        @Override
        public void startDocument() throws SAXException {

            this.vacature = new Vacature();
        }

        @Override
        public void endDocument() throws SAXException {
            // Nothing to do

        }

        /** Gets be called on opening tags like: 
         * <tag> 
         * Can provide attribute(s), when xml was like:
         * <tag attribute="attributeValue">*/
        @Override
        public void startElement(String namespaceURI, String localName,
                String qName, Attributes atts) throws SAXException {

        }

        /** Gets be called on closing tags like: 
         * </tag> */
        @Override
        public void endElement(String namespaceURI, String localName, String qName)
                throws SAXException {
            if (localName.equals("vacatures")) {

            }else if (localName.equals("vacature")) {
            }else if (localName.equals("titel")) {
                vacature.setTitel(buff.toString());         
            }else if (localName.equals("werkveld")){            
                vacature.setWerkveld(buff.toString());
            }else if (localName.equals("regio")){

                vacature.setRegio(buff.toString());
                arrayVaca.add(vacature);
                vacature = new Vacature();

            }

            buff = new StringBuilder();
        }

        /** Gets be called on the following structure: 
         * <tag>characters</tag> */
        @Override
        public void characters(char ch[], int start, int length) {          
             if (buff!=null) {
                    for (int i=start; i<start length; i  ) {
                        buff.append(ch[i]);
                    }
                }

        }
    }