Auf Thema antworten

In deinem Beispiel willst du dich mit "up" und "add" dynamisch durch den Baum bewegen. Das geht eben nur wenn der gesamte XML-Baum im Speicher gehalten wird.


Ein erster Test wäre, ob es mit größeren Stackspace geht (JVM Setting -Xss:2m oder mehr).

Unabhängig ob man das so nutzen kann hätte man dann andere Fehlerquellen (Classloader etc) ausgeschlossen.


Eine Idee wäre: die End-Datei zu stückeln. Wer z.B. 200 Seiten Report baut, kann ja 10 Seiten bauen, generieren, wegspeichern, dann die nächsten 10 Seiten und am Ende alle zusammenfügen. Je nach Dokumentenstruktur kann das einfach oder schwierig sein.


Eine weitere Möglichkeit wäre das manuelle herausschreiben mit einem XMLStreamWriter (Stichwort: Java StaX). Dieser Weg ist aber sehr technisch, da man vom erzeugten finalen DOM-Baum erst alle Tags durchgehen muss.


[code]


Document document = ...

document.appendChild(...)

document.appendChild(...)

...


// Wenn fertig, root Node holen


Element rootNode = document.getDocumentElement();


// Hier wird StaX genutzt

XMLOutputFactory outputFactory = XMLOutputFactory.newFactory();

XMLStreamWriter writer = outputFactory.createXMLStreamWriter(dateiName, encoding);


// Pseudocode!

// Hier einfach das ganze Dokument durchgehen und jedes Element

// systematisch rausschreiben, mit oder ohne Attribute etc.


for (Element childNode : rootNode.allNodes())

 {

    writer.writeStartElement(childNode.getElementName());

    // When attribute dann schreiben

    // writer.writeAttribute(name);

   ...

    writer.writeEndElement();

    writer.flush(); <- hier wird der Outputbuffer geleert und Speicher zurückgegeben!

}


writer.writeEndDocument();

writer.close();

[/code]


Dies ist etwas technisch, sollte aber in kurzer Zeit zu einem Ergebnis führen, wenn man unbedingt die Freiheit braucht sich durch den XML-Baum bewegen zu müssen.



Oben