Avatar billede deepcore Nybegynder
30. september 2004 - 11:19 Der er 5 kommentarer og
1 løsning

SAX parser til opretning af objekter - hvordan får jeg fat i dem?

(Dette spørgsmål vil kun give mening til dem der har arbejdet med java's saxparser før)

Jeg har oprettet en sax-parser i java.
Som standart laver man tre klasser til denne - hhv.
en controller, en xmlhandler og en errorhandler.

når xmlhandleren løber xmldokumentet kan man få den til at gøre et eller andet når den støder på specifikke tags.
Min opretter objekter. problemet ligger i at jeg ikke selv har en referance til xmlhandleren some er et interface, men hun til controlleren...

jeg vil jo gerne have fat i de nyoprettede objekter, så pt. kalder jeg en singletonklasse fra xmlhandleren som jeg kan få fat i udefra.... men jeg vil gerne have en lidt mere fix metode.

Jeg søger en metode til at hapse mine objekter ud af handler klassen.
Avatar billede arne_v Ekspert
30. september 2004 - 11:43 #1
Du sender noget f.eks. en collection med over i constructoren til den klasse som
implementerer handleren, så gemmer handleren i den og du har det.
Avatar billede arne_v Ekspert
30. september 2004 - 11:43 #2
Super simpelt eksempel:

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

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

public class SaxTest {
  private final static String XML_FILE = "C:\\saxtest.xml";
  public static void main(String[] args) {
      ArrayList data1 = new ArrayList();
      data1.add("a");
      data1.add("bb");
      data1.add("ccc");
      data1.add("dddd");
      writeXml(data1, XML_FILE);
      ArrayList data2 = readXml(XML_FILE);
      System.out.println(data2);
  }
  private static void writeXml(ArrayList data, String filename) {
      try {
        PrintWriter pw = new PrintWriter(new FileOutputStream(filename));
        pw.println("<?xml version='1.0' standalone='yes'?>");
        pw.println("<arraylist>");
        for (int i = 0; i < data.size(); i++) {
            pw.println(
              "  <element>" + (String) data.get(i) + "</element>");
        }
        pw.println("</arraylist>");
        pw.close();
      } catch (FileNotFoundException e) {
        e.printStackTrace();
      }
  }
  private static ArrayList readXml(String filename) {
      ArrayList result = new ArrayList();
      try {
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        XMLReader xr = sp.getXMLReader();
        xr.setContentHandler(new MySaxParser(result));
        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;
  }
}

class MySaxParser extends DefaultHandler {
  private StringBuffer element = new StringBuffer();
  private ArrayList result;
  public MySaxParser(ArrayList result) {
      this.result = result;
  }
  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")) {
        element = new StringBuffer();
      }
      return;
  }
  public void endElement(
      String namespaceURI,
      String localName,
      String rawName)
      throws SAXException {
      if (rawName.equals("element")) {
        result.add(element.toString());
      }
      return;
  }
}
Avatar billede arne_v Ekspert
30. september 2004 - 11:43 #3
Her gemmer handleren i en ArrayList.
Avatar billede deepcore Nybegynder
30. september 2004 - 12:49 #4
det var lige det jeg skulle bruge :)))
mange tak. (så mangler du bare at svare)
Avatar billede arne_v Ekspert
30. september 2004 - 12:56 #5
kommer her
Avatar billede arne_v Ekspert
17. oktober 2004 - 18:03 #6
Og så mangler du bare at acceptere
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