You should reuse class variables (date, value, change, ...) in your
endElement(...) callback routines. Everytime this is
called, you are assigning new values to date, value and change (make them
pointing to new values). Essentially, at the
end, your vector contains a list of objects with the same internal variable
values (the last one). Use the following:

       if (qName.compareToIgnoreCase("date") == 0) {
            date = new String(tempstring);
        } else if (qName.compareToIgnoreCase("value") == 0) {
            value = new String(tempstring);
        } else if (qName.compareToIgnoreCase("change") == 0) {
            change = new String(tempstring);
        } else if (qName.compareToIgnoreCase("data") == 0) {
            vector.add(new Data(date, value, change));
        }

This may not be the most efficient way of doing this (a string copy is
performed), but requires least change, a better probably
is to keep a stack of the values so that no copies are needed.

This is assuming that there is only one set of date, value, change elements
per data element parent.
I haven't tested this, but hope it works.

-JJ

Panagiotis Plevrakis wrote:

> In the following code I'm parsing an xml file that contains
> the elements <date>,<value>,<change> more than once. The parent
> element of these elements is <data> . I load their values in a Vector
> wrapped in a Data object. While I expect more than one set of data to be
> displayed, I get only the last one. What am I doing wrong?
> Thanks for your help.
> ***********************************************************
> import java.util.*;
> import java.io.*;
> import java.net.*;
> import javax.xml.parsers.*;
> import org.xml.sax.*;
> import org.xml.sax.helpers.*;
>
> public class Parser extends DefaultHandler {
>     Vector vector = new Vector();
>     String date, value, change, tempstring;
>     Data data = null;
>
>     public static void main(String[]args) {
>         Parser p = new Parser();
>         p.parse("database.xml");
>         p.display();
>     }
>
>     private void display() {
>         for (int i = 0; i < vector.size(); i++) {
>             System.out.println(vector.size()); //debug
>             data = (Data) vector.elementAt(i);
>
>             System.out.println(data.getDate() + "\n" +
>                                data.getValue() + "\n" +
>                                data.getChange() + "\n");
>             System.out.println();
>         }
>     }
>
>     private void parse(String file) {
>         try {
>             SAXParserFactory spf = SAXParserFactory.newInstance();
>
>             spf.setValidating(true);
>             SAXParser saxParser = spf.newSAXParser();
>             XMLReader xmlReader = saxParser.getXMLReader();
>
>             xmlReader.setContentHandler(this);
>             xmlReader.setErrorHandler(this);
>             String urlstring = "file:" +
>                                 new File (file).getAbsolutePath();
>             URL url = new URL(urlstring);
>             URLConnection connection = url.openConnection();
>             InputStream inputstream = connection.getInputStream();
>             InputSource inputsource = new InputSource(inputstream);
>
>             xmlReader.parse(inputsource);
>         } catch (Throwable err) {
>             System.out.println(err.getMessage());
>         }
>     }
>
>     public void startElement(String namespaceURI, String localName,
>         String qName, Attributes atts) throws SAXException {
>         tempstring = "";
>         if (qName.compareToIgnoreCase("data") == 0) {
>             date = "";
>             value = "";
>             change = "";
>         }
>     }
>
>     public void endElement(String uri, String localName,
>                            String qName) throws SAXException {
>         if (qName.compareToIgnoreCase("date") == 0) {
>             date = tempstring;
>         } else if (qName.compareToIgnoreCase("value") == 0) {
>             value = tempstring;
>         } else if (qName.compareToIgnoreCase("change") == 0) {
>             change = tempstring;
>         } else if (qName.compareToIgnoreCase("data") == 0) {
>             vector.add(new Data(date, value, change));
>         }
>     }
>
>     public void characters(char[] ch, int start,
>                            int length) throws SAXException {
>         String charactersfound = new String(ch, start, length);
>         tempstring = tempstring + charactersfound;
>     }
>
> class Data {
>
>     private String date = "";
>     private String value = "";
>     private String change = "";
>
>     public Data() {}
>
>     public Data(String date, String value, String change) {
>         this.date = date;
>         this.value = value;
>         this.change = change;
>     }
>
>     public String getDate() {
>         return date;
>     }
>
>     public String getValue() {
>         return value;
>     }
>
>     public String getChange() {
>         return change;
>     }
>
>     public void setDate(String date) {
>         this.date = date;
>     }
>
>     public void setValue(String value) {
>         this.value = value;
>     }
>
>     public void setChange(String change) {
>         this.change = change;
>     }
> } //end Data
> } //end Parser
> *********************************************************
>
> _________________________________________________________________
> MSN Photos is the easiest way to share and print your photos:
> http://photos.msn.com/support/worldwide.aspx
>
> To change your membership options, refer to:
> http://www.sys-con.com/java/list.cfm


To change your membership options, refer to:
http://www.sys-con.com/java/list.cfm

Reply via email to