0

次のように構築された XML ページを解析しようとしています: http://pastebin.com/t9cXdnGs。このチュートリアルに従って、基本的な SAX パーサーを実装しました: Anddev SAX チュートリアル

最後のタグの値しか取得していないことを除けば、かなりうまくいきました。これを解決するために、ArrayList を実装して、XML ノードごとに作成された各オブジェクトを追加しました。しかし、今、私は奇妙な出力を得ています。ループで通過するノードごとに、同じ値を再度追加します。したがって、ノード 1 では値を 1 回取得し、ノード 2 では値を 2 回取得するというように... (例: 値 1、値 2 値 2、値 3 値 3 値 3)

何が悪いのか理解できないようです...

このページの完全なソース コードは次のとおりです: http://pastebin.com/bkyz0g1U

4

2 に答える 2

0

同じオブジェクトを何度も再利用しているため、 に追加するオブジェクトは 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ます。

于 2011-04-12T09:01:52.060 に答える
0

コードをより単純なソリューションにすばやく変更しました。

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

        }
    }
于 2011-04-12T09:11:44.077 に答える