Проблема Android с ArrayList объектов в SAX-парсере - PullRequest
0 голосов
/ 12 апреля 2011

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

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

Я не могу понять, чтонеправильно ...

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

Ответы [ 2 ]

0 голосов
/ 12 апреля 2011

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

    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]);
                    }
                }

        }
    }
0 голосов
/ 12 апреля 2011

Вы снова и снова используете один и тот же объект, поэтому вы добавляете только один объект в 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.

...