Interne Stuktur der XML-Datei

Hi!

Ich spiele mit dem Gedanken das Eintragen meiner Kryptowährungstrades zu automatisieren und ein Programm dafür zu schreiben. Deswegen habe ich mir jetzt mal die XML Datei genauer angesehen, um nachzuvollziehen wie Portfolio Performance Einträge intern abspeichert.
Ich erkenne, dass die grobe Struktur mit <securities> für die Auflistung aller Wertpapiere, <accounts> für die Auflistung aller Konten und <portfolios> für die Auflistung aller Depots gegeben ist. Außerdem sehe ich, dass beim Anlegen von Transaktionen das enstprechende Konto und Depot miteinander in Beziehung gesetzt werden, indem ein croossEntry-Tag erstellt wird und dass mit mithilfe eines reference-Attributs unter Angabe eines relativen Pfads in der Tag-Hierarchie auf die Definitionsorte von Konten, Depots und Transaktionen verwiesen werden kann.
So weit so gut erstmal.

Nun ist es aber in meiner XML so, dass unter <portfolios> nicht, wie ich es erwarten würde, die Definitionen der Depots stehen, sondern lediglich Referenzen zu den Orten, wo die Depots eigentlich definiert werden. Das geschieht bei mir etwa in einem crossEntriy einer Konto Transaktion. Da dann in der Definition eines solchen Portfolios wiederum selbst alle Portfolio Transaktionen aufgelistet werden, die ihrerseits auch crossEntries enthalten, entsteht dadurch in meiner XML eine völlig undurchsichtige Struktur: Die eigentlichen Definitionen der einzelnen Konten und Depots sind in der Tag-Hierarchie nicht mehr, wie vermutlich üblich, auf gleichen, sondern auf total unterschiedlichen Stufen und die Verschachtelung wird bei mir massiv. Zum Beispiel steht die eigentliche Definition eines meiner Depots dadruch in einem CrossEntry eines CrossEntrys eines CrossEntrys eines CrossEntrys eines CrossEntrys eines CrossEntrys eines CrossEntrys :joy::joy::joy: und diese Definition wird dann unter <portfolios> wie folg referenziert:

<portfolio reference="../../accounts/account[3]/transactions/account-transaction/crossEntry/portfolio/transactions/portfolio-transaction[2]/crossEntry/portfolioFrom/transactions/portfolio-transaction/crossEntry/portfolioTo/transactions/portfolio-transaction[7]/crossEntry/portfolioTo/transactions/portfolio-transaction[5]/crossEntry/portfolioTo/transactions/portfolio-transaction[66]/crossEntry/portfolioFrom/transactions/portfolio-transaction[2]/crossEntry/portfolioTo"/>

Obwohl meine XML ohne Probleme lädt, schätze ich, dass ich mir irgendwann mal eine saubere Struktur kaputt gemacht habe. Vielleicht habe ich mal ein falsches Depot bei einer Buchung benutzt und das nachträglich erst geändert als ich bereits mehrere dutzende anderen Buchungen mit anderen Depots und Konten angelegt hatte oder so, keine Ahnung.

:thinking: Oder ist diese Struktur aus irgendeinem, mir unersichtlichen Grund, vielleicht sogar normal und gewünscht?
Intuitiv würde ich jedenfalls erwarten, dass die Definitionen der Depots mit all ihren Transaktionen unter <portfolios> zu finden sind und dass in dem crossEntry einer Konto-Transaktion, die mit einer Depot-Transaktion verknüpft werden soll, einfach nur eine <portfolio reference=> steht. Insgesamt würde ich so erwarten, dass die Definitionen aller Depots und Konten dadurch auf der gleichen Ebene der Tag-Hierarchie stehen und dass die Tiefe der Tag-Hierarchie so begrenzt bleibt, und zwar gänzlich unabhängig davon wie viele Depots oder Konten man anlegt.

Das ist korrekt so, Deine Datei ist nicht kaputt.
Es wird jedes Objekt beim ersten Vorkommen serialisiert, jedes weitere Vorkommen ist dann nur eine Referenz.

XStream ist halt auf Serialisierung ausgelegt; nicht auf das Erzeugen von leicht zu bearbeitendem XML.

Vielleicht ist es sinnvoller, die gewünschte Bearbeitung an Java-Objekten vorzunehmen. Neulich ging es schon einmal um ein ähnliches Vorgehen, im Zusammenhang mit Auswertungen:

Ah ok, ich seh schon. Das ganze Erzeugen und Auslesen der XML wird in Portfolio Performance über eine externe Bibliothek geregelt und die serialisiert das client Objekt einfach brutal von Anfang bis Ende, in der Reihenfolge in der es gespeichert wurde, ohne sich Gedanken über die Endstruktur zu machen und diese ggf. zu optimieren.

Ich frag mich nun jedoch, ob es theoretisch möglich wäre, die Struktur selbst zu bereinigen? Also könnte ich in den crossEntry Einträgen immer nur <portfolio reference="..."> setzen und die eigentlichen Definitionen tatsächlich in die <portfolios> verschieben oder würde das dazu führen, dass die XML in Portfolio Performance nicht mehr gelesen werden kann?! Weil so wie es XStream jetzt standardmäßig macht, indem es die Objekte beim ersten Auftreten serialisiert, stehen genutzte Referenzen in der XML ja stets unter dem referenzierten Objekt. Die Frage ist also, ob das notwendig ist oder ob man theoretisch auch Referenzen auf Objekte in der XML anlegen darf, deren Definition in der XML erst später steht. Wenn das ginge, würde ich nämlich das tendieren die Struktur der XML erst zu bereinigen und dann in der bereinigten Struktur neue Einträge zu erstellen, was dann relativ leicht sein dürfte.

Wenn das nicht geht, wäre wohl die sinnvollste Idee, diesen Ansatz zu verfolgen. Da ich aber in Java überhaupt nicht fit bin, schrecke ich davor etwas zurück, weil der Aufwand für mich dann doch etwas zu groß wäre.