Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo allerseits,
Auch wenn die Klasse so heißt, hat das Problem selbst nichts mit XML zu tun.
Java:
/*ich habe hier eine klasse, der ich eine collection übergebe, die mit viele personenobjekten gefüllt wird*/
public class XmlPersonDocumentHandler extends DefaultHandler{
public final Collection<XmlPerson> persons;
private String currentAttribute;
private XmlPerson xmlPerson;//bezug auf eine andere Klasse
//private boolean currentPerson;
public XmlPersonDocumentHandler(Collection<XmlPerson> persons){
this.persons=persons;
}
//mehr methoden, zeugs,...
soweit so gut, dann nutze ich diese klasse weiter so:
Java:
public class XmlSaxParser {
public XmlSaxParser(String parserType){
super();//warum kann ich dem konstruktor hier nicht parserType übergeben?
}
public void parsePersonFile(String fileName) throws IOException, SAXException{
XMLReader reader = XMLReaderFactory.createXMLReader();
/*ich denke jetzt kommt der eigentliche knackpunkt. in der nächsten zeile müsste ich dem Handler doch eigentlich die Collection übergeben können oder??*/
reader.setContentHandler(new XmlPersonDocumentHandler(null));
reader.parse(new InputSource(new FileInputStream(fileName)));
}
}
Dann die main:
Java:
public class XmlPersonMain {
/*und hier müsste ich ja auch noch irgendwie die erzeuge ArrayList übergeben?!?*/
public static void main(String[] args) throws SAXException, IOException{
String xmlPersonFile = "input/xmlPersonFile.xml";
Collection<XmlPerson> xmlPersons = new ArrayList<XmlPerson>();
XmlSaxParser parser = new XmlSaxParser("XmlPersonParser");
parser.parsePersonFile(xmlPersonFile);
}
}
Hoffe das Problem wurde deutlich. Sonstige Fehler/Anmerkungen sind sehr willkommen!
Danke.
> in der nächsten zeile müsste ich dem Handler //doch eigentlich die Collection übergeben können oder??
ja
> Hoffe das Problem wurde deutlich.
besteht eins?
wie wärs mit
> public void parsePersonFile(String fileName, noch ein Parameter, die Collection)
statt
> public void parsePersonFile(String fileName)
-----
> //warum kann ich dem konstruktor hier nicht parserType übergeben?
wer sollte das bekommen und warum? über deiner Klasse ist nur noch Object und diese Klasse interessiert sich nicht für Parameter
1) Du kannst dem Konstruktor parseType nich übergeben, weil Object nur einen leeren Konstruktor besitzt.
2) Ich würde in der Main die Collection am XmlSaxParser per Konstruktor übergeben, sie darin in eine Klassenvariable speichern und diese in der parsePersonalFile statt null weitergeben.
Ne, so ganz deutlich wurde das Problem nicht.
1. Welchem Konstruktor willst du parserType übergeben? Du leitest ja von Object ab.
2. Was hindert dich daran dem Handler eine Collection übergeben?
3. In der Main erstellst du eine Instanz von XmlSaxParser, da kannst du nirgendswo eine Liste übergeben....
Aber generell weiß ich nicht wirklich was du machen willst.
Wow das ging ja fix...vielen Dank für die schnellen Antworten.
Naja das Problem ist ja, dass ich in der main letztlich auch eine neue Collection erzeugen muss, in der dann meine ganzen objekte reingepackt werden, de ja aber auch beim XmlSaxParser irgendwie vorkommen muss, weil der ja auf die Handler Klasse zugreift....besser?!?
wie wärs mit
> public void parsePersonFile(String fileName, noch ein Parameter, die Collection)
Heißt er bleibt leer oder kann ich ihn dann ganz weglassen?
2) Ich würde in der Main die Collection am XmlSaxParser per Konstruktor übergeben, sie darin in eine Klassenvariable speichern und diese in der parsePersonalFile statt null weitergeben.
Das schaffst du selbst, Konstruktor sind im großen und ganzen genauso wie Methoden.
Du übergibst das genauso wie dem String, nur dass der String direkt übergeben und nicht in einer Variable zwischengespeichert ist.
super kannst du weglassen, wird wenn ein leerer Konstruktor in der Superclass existiert automatisch verwendet. Nur wenn keiner da ist oder du einen nicht-leeren verwenden willst musst du super explizit angeben. (Ist ja logisch.)