Einlesen einer XML-Datei mit mehreren Tabellen

Hi,
ich komme von der Sprache C#. Evtl kennt es der ein oder andere. Dort ist es so, dass man eine riesige Menge an Daten mit einem DataSet handeln kann. In diesem DataSet gibt es mehrere Tabellen. Jede dieser Tabellen enthält mehrere Spalten und mehrere Zeilen. Bin ich fertig mit meiner Bearbeitung der Daten, sage ich dann _dataset.WriteXml(“C:\ est.xml”). Und beim einlesen das gleiche, nur mit ReadXml.
Mein Vorhaben:
Ich habe ein Programm für den Rechner programmiert, das mit 3 Tabellen arbeitet. Diese schreibe ich wie gesagt in eine XML Datei.
Nun zu Java:
Ich möchte diese 3 Tabellen nun auf dem Handy (Android) auslesen können und die Zeilen jeder Tabelle durch iterieren können. Ich habe nun schon herausgefunden, dass es unendlich viel aufwändiger ist in Java, jedoch bisher noch keine Lösung gefunden die mich zufriedenstellt. Ich bin noch Anfänger und gebe alles um es zu verstehen. Aber z.Z. hänge ich wirklich fest.

Vielen Dank,
MysteriX

DTM DefaultTableModel, Serializable oder die String[][] so schreiben, und fertig. Dein Problem besteht darin, DataSet-(XML) lesen und schreiben nach DataSet-(XML) <- hier Klammern nur deshalb, weil es noch ne bisschen fraglich ist, ob wirklich XML.

Hiho, heißt ich kann mein XML, so wie ich es mit C# benutze, hier nicht nehmen? folgendermaßen sieht meine XML-Datei aus:

[XML]<?xml version="1.0" standalone="yes"?>

<xs:schema id=“NewDataSet” xmlns="" xmlns:xs=“http://www.w3.org/2001/XMLSchema” xmlns:msdata=“urn:schemas-microsoft-com:xml-msdata”>
<xs:element name=“NewDataSet” msdata:IsDataSet=“true” msdata:UseCurrentLocale=“true”>
xs:complexType
<xs:choice minOccurs=“0” maxOccurs=“unbounded”>
<xs:element name=“Kalender”>
xs:complexType
xs:sequence
<xs:element name=“Datum” type=“xs:dateTime” minOccurs=“0” />
<xs:element name=“Eintrag1” type=“xs:string” minOccurs=“0” />
<xs:element name=“Eintrag2” type=“xs:string” minOccurs=“0” />
<xs:element name=“Eintrag3” type=“xs:string” minOccurs=“0” />
<xs:element name=“Wichtig” type=“xs:string” minOccurs=“0” />
<xs:element name=“HakenEintrag1” type=“xs:string” minOccurs=“0” />
<xs:element name=“HakenEintrag2” type=“xs:string” minOccurs=“0” />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name=“Geburtstage”>
xs:complexType
xs:sequence
<xs:element name=“Datum” type=“xs:dateTime” minOccurs=“0” />
<xs:element name=“Name” type=“xs:string” minOccurs=“0” />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>

2013-09-22T00:00:00+02:00
a
s
d
False




2013-09-22T00:00:00+02:00


[/XML]

Ich hab dir mal schnell was vorbereitet in Richtung Serialisierung:

 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication1;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import javax.swing.JFileChooser;

/**
 * @author ikwudls
 */
public class Tab implements Serializable {

    private ArrayList<ArrayList<String>> rcData = new ArrayList<ArrayList<String>>();

    public void add(int r, int c, String s) {
        if (r < rcData.size()) {
            if (c < rcData.get(r).size()) {
                rcData.get(r).set(c, s);
            } else {
                rcData.get(r).add(c, s);
            }
        } else {
            ArrayList<String> as = new ArrayList<String>();
            as.add(c, s);
            rcData.add(r, as);
        }
    }

    @Override
    public String toString() {
        return "Tab{" + "rcData=" + rcData + '}';
    }

    public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
        long t1 = System.currentTimeMillis();
        Tab t = new Tab();
        t.add(0, 0, "Bernd");
        t.add(0, 1, "hatte");
        t.add(0, 2, "husten");
        t.add(0, 3, "müssen");
        t.add(0, 4, "sollen");
        t.add(0, 5, "gehabt");
        t.add(1, 0, "!");
        JFileChooser jfc = new JFileChooser();
        if (jfc.showOpenDialog(null) != JFileChooser.APPROVE_OPTION) {
            return;
        }
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(jfc.getSelectedFile()));
        oos.writeObject(t);
        oos.flush();
        oos.close();
        Thread.sleep(1000L);
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(jfc.getSelectedFile()));
        t = (Tab) ois.readObject();
        ois.close();
        System.out.println("t = " + t);
        System.out.println(t1 - System.currentTimeMillis());
    }
}```

(Streams innerhalb des finally-Blocks schließen wird empfohlen)

In der Datei steht jetzt ziemliches Kauderwelsch.

Die Ausgabe lautet: `t = Tab{rcData=[[Bernd, hatte, husten, müssen, sollen, gehabt], [!]]}`. Die benötigte Zeit wird mit ausgegeben. Ich kennen niemanden, der Bernd heißt, niemand möchte sich dadurch angesprochen fühlen.

Nachtrag: showOpenDialoge ersetzen durch showSaveDialog ist hier sinniger (<- das Wort ist auch schon wieder ein "Unwort"^^).

Hi,
vielen dank für die ausführliche Antwort. Aber eins hab ich noch nich ganz verstanden. Mein bisheriges XML kann ich damit dann wohl nichtmehr nutzen oder? Das ist ja schade :frowning: Dann muss ich ja mein komplettes Desktopprogramm auch wieder anpassen. Die Arbeit endet nie :slight_smile:

[QUOTE=mysterix]Hi,
Mein bisheriges XML kann ich damit dann wohl nichtmehr nutzen oder?[/QUOTE]
Warte bitte, ob noch jemand anderem etwas besseres einfällt …

Doch, du kannst XML mit StAX, SAX lesen, DOM bearbeiten. Die Schwierigkeit wird nur sein, die “Tabelle” ins richtig Format zu bekommen. http://www.torsten-horn.de/techdocs/java-xml.htm diese Seite bookmarken ist wohl ganz gut. Es geht hier ja um eine Brücke C# DataSet <-> JAVA-Mobilphon-Anwendung. Ignoriere die Kommentare meiner Hater einfach.

Hallo mysterix,

IMHO macht Java i. A. einen guten Job beim XML-Verarbeiten und Dein XML lässt sich unverändert mit geringem Aufwand nach Java unmarshallen. Lauffähiges Maven-Projekt ist angehängt:

Kniffliger wird es durch die Anforderung, das auf Android zu bewerkstelligen. Leider habe ich auf dieser Plattform keine Erfahrung, aber die XML-Library, die ich gern als Alternative zum dicken JAXB einsetze ist XStream. XStream behauptet von sich, auf Android zu laufen.

Das Maven-Projekt hat einen XStream-Parser für Dein XML. Schau Dir mal die Unit-Tests an: Importer.fromXML() liefert Dir die Daten aus dem XML in einer Instanz von NewDataSet, die hat zwei Listen: geburtstage und kalender.

Das einzig Dumme ist, dass Java stark beim Verarbeiten von Datumsfomaten patzt; hier habe ich Joda-Time verwendet, um die ISO8601-Strings zu parsen. Ich hoffe, das hilft Dir alles weiter.

Grüße,

Kay