XML zum Importieren von Daten?



  • Hallo,

    momentan hab ich in meinem Programm die Eingabedaten noch hartcodiert, was sich natürlich ändern soll. Alles über 'ne GUI zu machen ist mir ehrlich gesagt zu aufwändig.

    Ich stell mir das so vor, dass ich Datensätze vorgefertigt in XML Dateien habe, die ich dann im Bedarfsfall verändere und immer importiere. Mit XML kenn ich mich aber noch nicht so richtig aus.

    Meine Fragen: Ist das vom Ansatz her vernünftig oder sollte ich mir das besser abschminken? Hat jemand evtl. eine Seite (außer Google ;-)) auf der ich weierführende Informationen finden kann, die sich nur generell mit XML befassen, sondern eher zu meinem Problem passen? Welche Klassen nimmt man da am besten (ich arbeite mit Eclipse 3.0)?

    Vielen Dank schonmal,

    Tim



  • Ich würde dir zu JDOM raten. Ansonsten findest Du auf der W3C XML-Seite drun grundlegenden Informationen.
    Ansonsten schau Dir mal XML Pitstop an.



  • Ich hab mir JDOM mal angesehen und es sieht wirklich gut bzw. einfach in der Anwendung aus. Danke.



  • Hm. Bis jetzt hab ich nur Infos gefunden, wie ich die XML Daten als "Element" Instanzen rauskriege. Ich würd sie aber gerne für normale Objekte weiterbenutzen. Geht sowas in der Art:

    Person person1 = new Person( [Parameter ist in XML Datei gespeichert] );
    person1.setHaarfarhe( [Parameter ist in XML Datei gespeichert] );
    ...
    


  • Tim99 schrieb:

    Hm. Bis jetzt hab ich nur Infos gefunden, wie ich die XML Daten als "Element" Instanzen rauskriege. Ich würd sie aber gerne für normale Objekte weiterbenutzen. Geht sowas in der Art:

    Person person1 = new Person( [Parameter ist in XML Datei gespeichert] );
    person1.setHaarfarhe( [Parameter ist in XML Datei gespeichert] );
    ...
    

    Zum verständnis: Du hast also vor, dass XML-Dokument zu öffnen und dann direkt die Parameter der Nodes zu ändern? Imho ist sowas leider nicht möglich, Du musst erst die Werte einlesen und dann zurück schrieben, ein on-the-fly Schreiben ist vorgesehen (Korrigie mich jemand, wenn ich da falsch liege).



  • In das XML Dokument schreiben will ich eigentlich gar nicht. Ich will über einen GUI-Dialog ein XML Dokument einlesen. Die Informationen daraus möchte ich dann zum Erzeugen von Objekten benutzen. Ich glaube, das ist der einfachste Weg, mein Programm mit mehreren unterschiedlichen Datensätzen starten zu können.

    Momentan schaue ich mir gerade http://www.castor.org an. Ich glaube, das geht in meine Richtung.



  • Mit jdom geht das nicht. Musst halt xml parsen und aus den Informationen deine Objekte erzeugen. Oder benutzt ein High-Level API wie JAXB oder JSX, dies könnte aber zu Perfomance verlusten führen, da diese einen zieml. Overhead mit sich bringen.



  • Ich habs jetzt so gemacht:

    castor.jar von www.castor.org und das xerces-j.zip Paket mit diversen xerces-Jars von www.apache.org runtergeladen und eingebunden.

    Soweit wie ich im Moment bin, kann ich ganz einfach Java-Objekte in XML-Dateien speichern:

    import java.io.FileWriter;
    
    Person person = new Person();
    person.setHaarfarbe("blond");
    person.setAlter(44),
    ...
    
    FileWriter writer = new FileWriter("test.xml");
    /* Eclipse zwingt mich allerdings zu einem try/catch Konstrukt... */
    
    Marshaller.marshal(person, writer);
    

    Und schon hab ich die Informationen über das Objekt in der XML Datei gespeichert. Ich werd mal ein bisschen weiterbasteln, aber das sieht eigentlich schon ziemlich komfortabel aus und der umgekehrte Weg wird ja auch nicht so schwer sein.



  • Hm. Beim Einlesen kommt leider Murks raus. Der Compiler schluckt zwar alles, aber sobald Attribute eines Objekts nicht mehr nur primitive Datentypen sind, wird es nicht korrekt übernommen. Hat jemand einen Tipp?

    Ich persönlich befürchte, dass ich um ein XML-Schema für's Mapping nicht herumkomme. Dann müsste ich mich da auch noch durchkämpfen. Bitte sag mir einer, dass ich das nicht muss...



  • Du könntest das Objekt Person auch in eine XML Datei serialisieren:

    import java.io.*;
    import java.beans.*;
    
    Person person = new Person(); //Person muss java.io.Serializable implementieren
    person.setHaarfarbe("blond");
    person.setAlter(44),
    
    XMLEncoder out = null;
    try {
        out = new XMLEncoder(new FileOutputStream("person.xml"));
        out.writeObject(person);
        out.flush();
    }catch (IOException ex0) {
        System.err.println("Fatal error while writing");
    }
    finally {
        try {
            out.close();
        }catch (Exception ex1) {
            System.err.println("Fatal error while closing Outputstream");
        }
    }
    

    Mit dem XMLDecoder kannst du es dann wieder lesen.

    XMLDecoder in = null;
    try {
        in = new XMLDecoder(new FileInputStream("person.xml"));
        Person p = (Person)in.readObject();
    }catch (IOException ex0) {
        System.err.println("Fatal error while reading");
    }
    finally {
        try {
            in.close();
        }catch (Exception ex1) {
            System.err.println("Fatal error while closing Inputstream");
        }
    }
    


  • Danke für den ausführlichen Ratschlag. Ich hab mich im ersten Moment auch sehr über die elegante Möglichkeit gefreut. Aber was muss ich sehen:

    2004-09-14 17:55:56.932 java_swt[388] Apple AWT Java VM was loaded on first thread -- can't start AWT.
    Exception in thread "main" java.lang.InternalError: Can't start the AWT because Java was started on the first thread. Make sure StartOnFirstThread is not specified in your application's Info.plist or on the command line
    at java.lang.ClassLoaderNativeLibrary.load(NativeMethod)atjava.lang.ClassLoader.loadLibrary0(ClassLoader.java:1586)atjava.lang.ClassLoader.loadLibrary(ClassLoader.java:1503)atjava.lang.Runtime.loadLibrary0(Runtime.java:788)atjava.lang.System.loadLibrary(System.java:834)atsun.security.action.LoadLibraryAction.run(LoadLibraryAction.java:50)atjava.security.AccessController.doPrivileged(NativeMethod)atsun.awt.NativeLibLoader.loadLibraries(NativeLibLoader.java:38)atsun.awt.DebugHelper.<clinit>(DebugHelper.java:29)atjava.awt.Component.<clinit>(Component.java:506)atjava.lang.Class.forName0(NativeMethod)atjava.lang.Class.forName(Class.java:141)atjava.beans.DefaultPersistenceDelegate.classNativeLibrary.load(Native Method) at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1586) at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1503) at java.lang.Runtime.loadLibrary0(Runtime.java:788) at java.lang.System.loadLibrary(System.java:834) at sun.security.action.LoadLibraryAction.run(LoadLibraryAction.java:50) at java.security.AccessController.doPrivileged(Native Method) at sun.awt.NativeLibLoader.loadLibraries(NativeLibLoader.java:38) at sun.awt.DebugHelper.<clinit>(DebugHelper.java:29) at java.awt.Component.<clinit>(Component.java:506) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:141) at java.beans.DefaultPersistenceDelegate.class(DefaultPersistenceDelegate.java:83)
    at java.beans.DefaultPersistenceDelegate.initBean(DefaultPersistenceDelegate.java:285)
    at java.beans.DefaultPersistenceDelegate.initialize(DefaultPersistenceDelegate.java:395)
    at java.beans.PersistenceDelegate.writeObject(PersistenceDelegate.java:103)
    at java.beans.Encoder.writeObject(Encoder.java:55)
    at java.beans.XMLEncoder.writeObject(XMLEncoder.java:250)
    at java.beans.Encoder.writeExpression(Encoder.java:260)
    at java.beans.XMLEncoder.writeExpression(XMLEncoder.java:363)
    at java.beans.DefaultPersistenceDelegate.doProperty(DefaultPersistenceDelegate.java:219)
    at java.beans.DefaultPersistenceDelegate.initBean(DefaultPersistenceDelegate.java:254)
    at java.beans.DefaultPersistenceDelegate.initialize(DefaultPersistenceDelegate.java:395)
    at java.beans.PersistenceDelegate.writeObject(PersistenceDelegate.java:103)
    at java.beans.Encoder.writeObject(Encoder.java:55)
    at java.beans.XMLEncoder.writeObject(XMLEncoder.java:250)
    at java.beans.Encoder.writeExpression(Encoder.java:260)
    at java.beans.XMLEncoder.writeExpression(XMLEncoder.java:363)
    at java.beans.PersistenceDelegate.writeObject(PersistenceDelegate.java:100)
    at java.beans.Encoder.writeObject(Encoder.java:55)
    at java.beans.XMLEncoder.writeObject(XMLEncoder.java:250)
    at java.beans.Encoder.writeObject1(Encoder.java:192)
    at java.beans.Encoder.cloneStatement(Encoder.java:205)
    at java.beans.Encoder.writeStatement(Encoder.java:236)
    at java.beans.XMLEncoder.writeStatement(XMLEncoder.java:326)
    at java.beans.XMLEncoder.writeObject(XMLEncoder.java:253)
    at spielplanfarm.Welt.ligaErstellen(Welt.java:321)
    at spielplanfarm.Welt.<init>(Welt.java:45)
    at spielplanfarm.SpielplanfarmMain.main(SpielplanfarmMain.java:23)

    Was hat das zu bedeuten? Und vor allem: Was hat AWT damit zu tun? Ich benutze es nicht, sondern SWT.



  • http://xstream.codehaus.org

    ...und alle meine Probleme sind nun gelöst. Das ist ja mal einfach und komfortabel. Und diesmal klappts auch! Danke Euch allen für Eure Tipps.


Log in to reply