DOM mit Singleton

aja

Mitglied
Hallo,
ich lese eine .xml-Datei mit Hilfe von DOM aus. Da der DOM-Baum an mehreren Stellen benötigt wird, wollte ich eine Singleton-Klasse haben und den Baum als deren Instanz. Weiß aber nicht so richtig wie ich das machen soll.
Also ich habe eine Methode geschrieben, die den Pfad der .xml-Datei entgegennimmt und das Dokument zurückgibt:
Code:
 private Document parseXml(String xmlFile){...}
Der Rest meiner Klasse sieht wie für Singleton üblich aus:
Code:
public final class ParseXmlFile {

	private static ParseXmlFile instance;
	
	private ParseXmlFile() {}

	public synchronized static ParseXmlFile getInstance() {
		if (instance == null) {
			instance = new ParseXmlFile();
		}
		return instance;
	} ... }
Wie kann ich die Instanz mit dem Wert des Aufrufs von parseXml(fileSource); belegen? Ich versuchte, als den Typ der Instanz Document nehmen, aber das mag der Compiler nicht. Dann versuchte ich, die Methode parseXml so umzuändern, dass sie ParseXmlFile-Objekt liefert, es lässt sich aber nicht von doc auf PXF clustern. Wie kann ich den Baum darein schieben?
 
Hallo,

ich weiß ja nicht ob du später mehrere XML-Dateien verwendest, aber ich hab dir mal ein Beispiel als FlyWeight fertig gemacht. Beim Singleton wäre nämlich ein Nachteil, wenn du mehrere Dateien öffnen möchtest, würdest du den DOM-Baum immer mit der neu zu öffnenden Datei immer wieder überschreiben. Das passiert bei einem FlyWeight nicht.

Java:
import java.io.File;
import java.util.HashMap;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;

public class DomFlyWeightExample
{

  private static Map<File, DomFlyWeightExample> instances = new HashMap<File, DomFlyWeightExample>();
  
  private Document xmlDocument = null;

  private DomFlyWeightExample(File xmlFile)
  {
    try
    {
      DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();

      xmlDocument = builder.parse(xmlFile);
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
    

  }

  public static DomFlyWeightExample getInstance(File xmlFile)
  {
    DomFlyWeightExample instance = instances.get(xmlFile);
    if(instance == null){
      instance = new DomFlyWeightExample(xmlFile);
      
      instances.put(xmlFile, instance);
    }
    return instance;
  }

  /**
   * @return the xmlDocument
   */
  public Document getXmlDocument()
  {
    return xmlDocument;
  }

}


Das müsste dir eigentlich weiter helfen.

MFG

zEriX
 
Zurück