Avatar billede trp79 Nybegynder
04. marts 2003 - 01:27 Der er 12 kommentarer og
1 løsning

Fejl ved læsning fra XML-fil

Når jeg forsøger at eksekverer følgende kode:

public static void main(String[] arguments)
{
ArrayList kPListe = new ArrayList();
ArrayList firmaListe = new ArrayList();

FirmaXml firmDb = new FirmaXml();
firmaListe = firmDb.readFirmaXml("Firma.xml");

KPersonXml kPDb = new KPersonXml();
kPListe = kPDb.readKontaktPersonXml(firmaListe,"KPerson.xml");  //LINIE 23
***********************************************************

Får jeg denne fejl:
Exception in thread "main" java.lang.NoSuchMethodError: MySaxParser2.<init><Ljava/util/ArrayList;Ljava/util/ArrayList;>V
    at KPersonXml.readKontaktPersonXml(KPersonXml.java:53)
    at Run.mail(Run.java:23)

***********************************************************

***********************************************************

KPersonXml.java ser således ud:

public class KPersonXml {

    public static void writeKontaktPersonXml(List data, String filename) {
        try {
            PrintWriter pw = new PrintWriter(new FileOutputStream(filename));
            pw.println("<?xml version='1.0' standalone='yes'?>");
            pw.println("<arraylist>");
            KontaktPerson current = null;
            for (int i = 0; i < data.size(); i++) {
                current=(KontaktPerson) data.get(i);
                pw.println("  <element>");
                    pw.println(" <navn>" + xmlConvert(current.getNavn()) + "</navn>");
                    pw.println(" <firma>" + xmlConvert(current.getFirma()) + "</firma>");
                    pw.println(" <tlf>" + xmlConvert(current.getTlf()) + "</tlf>");
                    pw.println(" <mobil>" + xmlConvert(current.getMobil()) + "</mobil>");
                    pw.println(" <email>" + xmlConvert(current.getEmail()) + "</email>");
                    pw.println(" <noter>" + xmlConvert(current.getNoter()) + "</noter>");
                    pw.println(" <oprettet>" + xmlConvert(current.getOprettet()) + "</oprettet>");
                    pw.println( "</element>");
            }
            pw.println("</arraylist>");
            pw.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
    public static ArrayList readKontaktPersonXml(ArrayList firmaListe,String filename) {
        ArrayList result = new ArrayList();
        try {
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();
            XMLReader xr = sp.getXMLReader();
            xr.setContentHandler(new MySaxParser2(result, firmaListe));      //LINIE 53
            xr.parse(filename);
        } catch (FactoryConfigurationError e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

  public static String xmlConvert(String tmp)
  {
      String s = tmp.replaceAll("&", "&amp;");
      tmp = s.replaceAll("<", "&lt;");
      s = tmp.replaceAll(">", "&gt;");
        return s;
  }
}

class MySaxParser2 extends DefaultHandler {
    private StringBuffer element = new StringBuffer();
    private KontaktPerson kPObj;
    private ArrayList result;
    private ArrayList firmaListe;
    Metoder m = new Metoder();
    public MySaxParser2(ArrayList result, ArrayList firmaListe) {         
        this.result = result;
        this.firmaListe = firmaListe;
    }
    public void characters(char buf[], int offset, int len)
        throws SAXException {
        element.append(new String(buf, offset, len));
        return;
    }

    public void startElement(
        String namespaceURI,
        String localName,
        String rawName,
        Attributes atts)
        throws SAXException {
        if (rawName.equals("element")) {
            kPObj = new KontaktPerson();
        }
        if (rawName.equals("navn")) {
            element = new StringBuffer();
        }
        if (rawName.equals("firma")) {
            element = new StringBuffer();
        }
        if (rawName.equals("tlf")) {
            element = new StringBuffer();
        }
        if (rawName.equals("mobil")) {
            element = new StringBuffer();
        }
        if (rawName.equals("email")) {
            element = new StringBuffer();
        }
        if (rawName.equals("noter")) {
            element = new StringBuffer();
        }
        if (rawName.equals("oprettet")) {
            element = new StringBuffer();
        }
        return;
    }

    public void endElement(
        String namespaceURI,
        String localName,
        String rawName)
        throws SAXException {
        if (rawName.equals("element")) {
            result.add(kPObj);
        }
        if (rawName.equals("navn")) {
            kPObj.setNavn(element.toString());
        }
        if (rawName.equals("firma")) {
            System.out.println(m.findFirma(firmaListe,element.toString()));
            kPObj.setFirma(m.findFirma(firmaListe,element.toString()));
        }
        if (rawName.equals("tlf")) {
            kPObj.setTlf(element.toString());
        }
        if (rawName.equals("mobil")) {
            kPObj.setMobil(element.toString());
        }
        if (rawName.equals("email")) {
            kPObj.setEmail(element.toString());
        }
        if (rawName.equals("noter")) {
            kPObj.setNoter(element.toString());
        }
        if (rawName.equals("oprettet")) {
            kPObj.setOprettet(element.toString());
        }
        return;
    }
}

Date date;
DateFormat df = new SimpleDateFormat("dd-MMM-yyyy HH:mm");
}

***********************************************************

Den søge metode jeg benytter i objektet m ser således ud:

public Firma findFirma(ArrayList firmaListe, String navn)
{
    Firma current = null;
    for(int i=0; i<firmaListe.size(); i++)
    {
        current=(Firma)firmaListe.get(i);
        System.out.println(current.getNavn());
        if(current.getNavn().equals(navn))
        {
            return current;
        }
        else
        {
            //return null;
        }
    }return current;
}

***********************************************************

Min Firma.xml ser således ud:

  <?xml version="1.0" standalone="yes" ?>
- <arraylist>
- <element>
  <navn>3B&O</navn>
  <land>Danmark</land>
  <adresse>Struervej</adresse>
  <husnr>11</husnr>
  <postnr>7600</postnr>
  <by>Struer</by>
  <tlf>97858585</tlf>
  <fax>97848484</fax>
  <email>B-O@b-o.dk</email>
  <noter>Noter-noter</noter>
  <oprettet>04-mar-2003 00:51</oprettet>
  </element>
- <element>
  <navn>4B&O</navn>
  <land>2Danmark</land>
  <adresse>2Struervej</adresse>
  <husnr>211</husnr>
  <postnr>27600</postnr>
  <by>2Struer</by>
  <tlf>297858585</tlf>
  <fax>297848484</fax>
  <email>2B-O@b-o.dk</email>
  <noter>2Noter-noter</noter>
  <oprettet>04-mar-2003 00:51</oprettet>
  </element>
  </arraylist

***********************************************************

og min KPerson.xml

  <?xml version="1.0" standalone="yes" ?>
- <arraylist>
- <element>
  <navn>1Start Ravnholt</navn>
  <firma>3B&O</firma>
  <tlf>tlf-1</tlf>
  <mobil>mobil-1</mobil>
  <email>email-1</email>
  <noter>Noter-1</noter>
  <oprettet>04-mar-2003 00:38</oprettet>
  </element>
- <element>
  <navn>2Stine Ravnholt</navn>
  <firma>4B&O</firma>
  <tlf>tlf-2</tlf>
  <mobil>mobil-2</mobil>
  <email>email-2</email>
  <noter>Noter-2</noter>
  <oprettet>04-mar-2003 00:38</oprettet>
  </element>
  </arraylist>

***********************************************************

Håber der er nogen der kan hjælpe. Nu har jeg søgt efter fejlen i timevis men kan ikke finde den :o(
Avatar billede trp79 Nybegynder
04. marts 2003 - 01:30 #1
Firma.java:

import java.io.*;
import java.util.*;
import java.text.*;//Til DateFormat

public class Firma implements Serializable
{
  private String navn;
  private String adresse;
  private String husNr;
  private String postNr;
  private String by;
  private String land;
  private String tlf;
  private String fax;
  private String email;
  private String noter;
  private String oprettet;

  public Firma()
  {
      navn=null;
      adresse=null;
      husNr=null;
      postNr=null;
      by=null;
      land=null;
      tlf=null;
      fax=null;
      email=null;
      noter=null;
      oprettet=null;
  }


  public Firma(String navn,String land,String adresse,String husNr,String postNr,String by,String tlf,String fax,String noter,String email,String oprettet)
  {
      this.navn=navn;
      this.land=land;
      this.adresse=adresse;
      this.husNr=husNr;
      this.postNr=postNr;
      this.by=by;
      this.tlf=tlf;
      this.fax=fax;
      this.email=email;
      this.noter=noter;
      this.oprettet=oprettet;
  }

    public String getNavn(){return this.navn;}
      public String getLand(){return this.land; }
    public String getAdresse(){return this.adresse; }
    public String getHusNr(){return this.husNr; }
    public String getPostNr(){return this.postNr; }
    public String getBy(){return this.by; }
    public String getTlf(){return this.tlf; }
    public String getFax(){return this.fax; }
    public String getEmail(){return this.email; }
    public String getNoter(){return this.noter; }
      public String getOprettet(){return this.oprettet; }

      public void setNavn(String navn){this.navn=navn; this.navn=this.navn; }
    public void setLand(String land){this.land=land; }
    public void setAdresse(String adresse){this.adresse=adresse; }
    public void setHusNr(String husNr){this.husNr=husNr; }
    public void setPostNr(String postNr){this.postNr=postNr; }
    public void setBy(String by){this.by=by; }
    public void setTlf(String tlf){this.tlf=tlf; }
    public void setFax(String fax){this.fax=fax; }
    public void setEmail(String email){this.email=email; }
    public void setNoter(String noter){this.noter=noter; }
    public void setOprettet(String oprettet){this.oprettet=oprettet; }

    public String toString() 
    {
        StringBuffer toString = new StringBuffer();
        toString.append(navn);
        return new String(toString);
    }

    public void vis()
    {
    System.out.println("****Firma****\n"
    +"Navn:\t     "+navn+ "\n"
    +"Land:\t     "+land+"\n"
    +"Adresse:     "+adresse+"\n"
    +"Noter:\t     "+noter+"\n"
    +"Oprettet:     "+getOprettet()+"\n"
    +"****Firma****\n");
    }
}
Avatar billede trp79 Nybegynder
04. marts 2003 - 01:33 #2
og min KontaktPerson.java:

import java.io.*;
import java.util.*;
import java.text.*;//Til DateFormat

public class KontaktPerson implements Serializable
{
  private Firma firma;
  private String navn;
  private String tlf;
  private String mobil;
  private String email;
  private String noter;
  private String oprettet;

  public KontaktPerson()
  {
    firma=null;
    navn=null;
    tlf=null;
    mobil=null;
    email=null;
    noter=null;
    oprettet=null;
  }

  public KontaktPerson(Firma firma,String navn,String tlf,String mobil,String email,String noter,String oprettet)
  {
      this.firma=firma;
      this.navn=navn;
      this.tlf=tlf;
      this.mobil=mobil;
      this.email=email;
      this.noter=noter;
      this.oprettet=oprettet;
  }

      public String getNavn(){return navn; }
      public String getFirma(){return firma.getNavn();}
    public String getTlf(){return tlf; }
    public String getMobil(){return mobil; }
    public String getEmail(){return email; }
    public String getNoter(){return noter; }
    public String getOprettet(){return oprettet; }

      public void setNavn(String navn){this.navn=navn; }
    public void setFirma(Firma firma){this.firma=firma;}
    public void setTlf(String tlf){this.tlf=tlf; }
    public void setMobil(String mobil){this.mobil=mobil; }
    public void setEmail(String email){this.email=email; }
    public void setNoter(String noter){this.noter=noter; }
    public void setOprettet(String oprettet){this.oprettet=oprettet; }

    public String toString() 
    {
        StringBuffer toString = new StringBuffer();
        toString.append(navn);
        return new String(toString);
    }

    public void vis()
    {
    System.out.println("****KontaktPerson****\n"
    +"Navn:\t     "+navn+ "\n"
    +"Firma:\t    "+firma.getNavn()+"\n"
    +"Tlf:\t     "+tlf+"\n"
    +"Mobil\t:     "+mobil+"\n"
    +"Noter:\t     "+noter+"\n"
    +"Oprettet:     "+getOprettet()+"\n"
    +"****KontaktPerson****\n");
    }
}

Det er godt nok en masse kode jeg har postet. Men det er "vist" det bedste at poste det hele nu istedet for at poste noget senere... det kan jo være at man kommer til at rette i noget og ikke lige får sagt det :o(

Håber nogen kan hjælpe, mvh og godnat
Torben
Avatar billede trp79 Nybegynder
04. marts 2003 - 08:22 #3
Den siger godt mok at metoden ikke findes.
Jeg tror selv at fejlen ligger i den måde jeg prøver at oprettet kontaktperson objekter på. Jeg tror det er det at et kontaktperson består af et firma objekt, som driller.
Avatar billede trp79 Nybegynder
04. marts 2003 - 08:42 #4
Jeg får nu også fejlen når jeg udmarker alt i main metoden kun kalder:
        ArrayList firmaListe = new ArrayList();
        FirmaXml firmDb = new FirmaXml();
        firmaListe = firmDb.readFirmaXml("Firma.xml");
        firmDb.writeFirmaXml(firmaListe, "Firma.xml");

Det er altså helt sort for mig :o(
Avatar billede arne_v Ekspert
04. marts 2003 - 09:00 #5
Et skud fra hoften ville være at det er noget kode som ikke
compiler og at du derfor kører mod en class-fil der er bygget
fra en ældre java-fil.

Kan du ikke lige prøve at slette alle class-filer, compile og så køre
igen ?
Avatar billede trp79 Nybegynder
04. marts 2003 - 15:07 #6
Efter at have slettet alle class filerne og xml filerne.
Kunne jeg godt compile uden at få fejl når jeg blot holdte mig til at oprette et par firmaobjekter og gemmer dem i en xml fil.
Men når jeg drager kontaktpersoner med ind og vil gemme dem i xml filer går det galt.

Nu tror jeg godt jeg ved hvor fejlen ligger.
Du (arne) postede mig (http://www.eksperten.dk/spm/323710)nogle klasser til at skrive og læse xml filer fra. I en af SAX klasserne er der bla. en innerclass MySaxParser2.
Problemet ligger så i at jeg har har en klasse der håndterer xml for Firma og en der håndterer xml for KontakPerson. Men at der disse to klasser indeholder innerclasser der hedder det samme. Jeg prøver lige at lave det om.
Avatar billede trp79 Nybegynder
04. marts 2003 - 15:20 #7
Det var det der var galt! :o)
Så nu virker det og jeg kan trække objekterne rigtigt ud. Da jeg har Person objekter der består af bla. et Firma objekt har jeg gjort brug af det du foreslog med at genne firmanavnet i person xml, og så ved oprettelsen igen af disse person objekter at søge udfra firma navnet og få returneret et firmaobjekt.  :o) :o)
Skønt at det bare funker nu, tak for hjælpen igen Arne :o)
Avatar billede arne_v Ekspert
04. marts 2003 - 16:10 #8
Ja - de skal hedde noget forskelligt.

Du kan endda overveje at ligge dem ud i separate Java filer. Jeg synes
tit at det gør det nemmere at holde styr på tingene.
Avatar billede trp79 Nybegynder
04. marts 2003 - 16:29 #9
Jeg det vil da lette overblikket en del! Så det er sket :o)
Tak for hjælpen og rådene :o)
Avatar billede arne_v Ekspert
04. marts 2003 - 20:45 #10
For at undgå et tilsvarende problem kan du enten bruge
en IDE (de fleste/alle IDE'er vil vise fejl i den situation)
eller bare compile alt i et hug.

Eksempel på det sidste:

Z1.java
-------

public class Z1 {
}

class Z {
}

Z2.java
-------

public class Z2 {
}

class Z {
}

enkeltvis compiler
------------------

C:\xml\z>javac Z1.java

C:\xml\z>javac Z2.java

C:\xml\z>

compile alt
-----------

C:\xml\z>javac *.java
Z2.java:4: duplicate class: Z
class Z {
^
1 error
Avatar billede trp79 Nybegynder
13. marts 2003 - 09:20 #11
Vil du ikke have pointene arne? Du hjalp mig trodsalt frem til en løsning :o)
Avatar billede arne_v Ekspert
19. marts 2003 - 10:52 #12
svar
Avatar billede trp79 Nybegynder
19. marts 2003 - 10:53 #13
Tak for hjælpen,
Mvh
torben
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester