JDOM, XMLOutputter: Methode zur Aktualisierung der Daten in XML Dokument

starbuck86

Mitglied
Hallo liebe Community.

Ich habe folgendes Problem. Ich baue mir ein XML Dokument aus einem Java-Programm auf. Dazu benutze ich eine Methode, die mir auf der Festplatte ein File anlegt, welches ich dann per JDOM einlese, im Speicher vervollständige und dann in das angelegte File abspeichere.

So die Theorie. In der Praxis erweist sich mir das etwas schwieriger!

File-Check- und Initialisierungs-Methode:
Java:
private void checkOutputFile(File xmlout) {
	if (xmlout.exists()) {
	    File oldfile = new File(GetParm.getOut_file() + ".old");
	    if (oldfile.exists()) {
		oldfile.delete();
	    }
	    xmlout.renameTo(new File(GetParm.getOut_file() + ".old"));
	}

	try {
	    xmlout.createNewFile();
	    xmlout.setExecutable(false);
	    xmlout.setReadable(true, false);
	    xmlout.setWritable(true, true);

	    writer = new FileWriter(xmlout);
	    BufferedWriter bw = new BufferedWriter(writer);
	    bw.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n");
	    bw.flush();
	    bw.write("<root/>");
	    bw.flush();

	    doc = new SAXBuilder().build(xmlout);
	    outputter.setFormat(Format.getPrettyFormat());

	    root = doc.getRootElement();
	    doc.setRootElement(root);

	    root.setAttribute("ts", Timestamp.getNativeStamp());

	    writer = new FileWriter(xmlout);
	    outputter.output(doc, writer);

	} catch (IOException e) {
	   
	} catch (JDOMException e) {
	 
	}

Schreib-Methode:
Java:
private void write2XML(String str, File xmlout) {
	String manager = str.split(":")[0];
	String[] message = str.split(":")[1].split(" ");
	String type = message[0].trim();

	boolean element_found_1 = false;
	boolean element_found_2 = false;
	boolean element_found_3 = false;
	boolean element_found_4 = false;

	if (type.equals("file")) {

	    // Type ist File
[... hier werden jetzt verschiedene Elemente im Hauptspeicher verändert]

	} else if (type.equals("aj")) {

	    // Type ist anchorjob
[... hier werden jetzt verschiedene Elemente im Hauptspeicher verändert]

	} else if (type.equals("mach")) {

	    // Type ist maschine
[... hier werden jetzt verschiedene Elemente im Hauptspeicher verändert]

	}

	try {
	    outputter.output(doc, writer);
	} catch (IOException e) {
	    // TODO Auto-generated catch block
	    e.printStackTrace();
	}

Und hier ist das Problem. Der Outputter schreibt mir jedes Mal das komplette XML-File, welches im Hauptspeicher liegt in die Datei dazu. D.h. bei jedem Input verdoppelt sich der Inhalt der Datei und alles ist X mal in der Datei.

Welche Möglichkeiten habe ich denn hier, außer die Datei zu leeren, neu zu initialisieren und dann zu schreiben?


Gruß,
Thomas
 
Zuletzt bearbeitet:
Problem gelöst. Wenn mir das aber noch jemand erklären könnte wäre das ne feine Sache.

Ich mache bei jeder Transaktion auf das XML-File einen neuen Writer auf

Java:
[...]
/** Schreiben der veränderten Daten in otfile.xml **/
	try {
	    FileOutputStream fso = new FileOutputStream(new File(GetParm.getOut_file()));
	    outputter.output(doc, fso);
	    fso.flush();
	    fso.close();
	} catch (IOException e) {
	    // TODO Auto-generated catch block
	    e.printStackTrace();
	}
[...]

Das sieht allerdings sehr ressourcenintensiv aus. Wenn jemand eine bessere Idee hat, immer her damit.

Gruß,
Thomas
 
Zurück