# Java XML Schnittstelle



## JAVAx (24. September 2010)

Hallo,

folgendes Problem: es läuft ein mysql Datenbank die befüllt ist. Ich möchte mit einem Java Programm die Datenbank durchgehen und auf eine vorgegebene Kriterien überprüfen. Wenn die Kriterien erreicht sind, soll dies in eine XML Datei geschrieben werden und wenn nicht geht es weiter!

Ich habe mich über einige Schnittstellen wie JAXP informiert- ohne erfolg.

Kann mir jemand Tipps geben welche Schnittstelle ich dafür nehmen kann****?

Danke


----------



## zer0 (24. September 2010)

Schau mal nach JDom oder dom4j! JDom habe ich selbst schon benutzt, finde es echt Klasse!

Gruß


----------



## JAVAx (24. September 2010)

ich benutze jdk v. 1.6... 

klappt das denn mit jdom? hat einer ein beispiel ?


----------



## JAVAx (24. September 2010)

ich verstehe das ganze nicht! meine aufgabe ist es eine ausgabe die ja eigentlich in der konsole zu sehen ist umzuleiten in eine xml datei.

ich habe mir mehrere tutorials durchgelesen. Es wird immer von einlesen einer xml datei geschrieben... das brauche ich ja sogesehen nicht-

sorry bin xml neuling!


----------



## gorefest (24. September 2010)

Hi, du kannst natürlich das XML selbst generieren und per FileOutputStream in eine Datei schreiben.

Ein Tool wie Apache XML Beans oder JAXB unterstützt Dich insofern, daß es Dir das XML Marshalling (Object -> XML) bzw das XML Unmarshalling (XML -> Object) abnimmt.

In Deinem konrekten Fall würdest Du ein Java Objekt befüllen und das Object dann in eine XML Datei schreiben. 

Der Vorteil eines solchen Vorgehens ist, dass Du niemals korruptes XML generierst.

Aber wie eingangs erwähnt, Du kannst auch Deinen XML Text in ein File schreiben.


----------



## JAVAx (24. September 2010)

das problem ist, dass ich lt. aufgabe eine java schnittstelle benutzen soll ( welches ist einfach?


----------



## gorefest (26. September 2010)

na dann ....

schau doch mal bei Apache XML Beans nach (xmlbeans.apache.org)

da sind auch demos.


----------



## JAVAx (26. September 2010)

XML Beans... soweit ich es in erfahrung bringen konnte unterstützt dies nicht JDK v. 1.6... oder liege ich da falsch****?


----------



## Tikonteroga (26. September 2010)

Hallo,

ich würde möglichst vermeiden externe Bibliotheken zu verwenden. Versuche es doch mal mit folgender Schnittstelle aus der Java 2 Plattform Standard Edition.

Document

DocumentBuilder

DocumentBuilderFactory

Gruß

Tikonteroga


----------



## Tikonteroga (26. September 2010)

JAVAx hat gesagt.:


> ich verstehe das ganze nicht! meine aufgabe ist es eine ausgabe die ja eigentlich in der konsole zu sehen ist umzuleiten in eine xml datei.
> 
> ich habe mir mehrere tutorials durchgelesen. Es wird immer von einlesen einer xml datei geschrieben... das brauche ich ja sogesehen nicht-
> 
> sorry bin xml neuling!


 
Hallo,

ist deine Konsolenausgabe bereits im XML Format ?


----------



## gorefest (27. September 2010)

Hi,

nein, XMLBeans benötigt mindestens jdk 1.5, weil es mit Annotations läuft. ein jdk1.6 ist problemlos.

Die Vermeidung von externen Bibliotheken muss man über am zu erwartenden Mehraufwand festmachen. 

Man kann sogar seine Konsolenausgabe in XML in eine Datei streamen. Damit verzichtet man aber komplett auf Typensicherheit auf XML-Seite. Besser finde ich da schon den Vorschlag mit dem DocumentBuilder.

Der Charme von JAXB/XMLBeans ist, dass man sich ums XML oder über DOM-Nodes überhaupt net mehr kümmern muss, weil das von der Library abgefackelt wird.

Grüße
gore


----------



## JAVAx (27. September 2010)

ist deine Konsolenausgabe bereits im XML Format ? ---->> Nein!

---------------------------

Bei einer anderen aufgabe sollte ich eine CSV Datei erstellen . Das war einfach mit einem Writer. Nur mit XML habe ich garkeine erfahrung!

also eine XML datei habe ich schon hinbekommen mit jaxb.
Ich habe bei den anderen aufgaben immer ohne objecten gearbeitet(muss ich mit objecten arbeiten?). Wie ich aber jetzt bei jaxb sehe werden die ergebnise von den objecten in die xml geleitet!?
Ich möchte also mit Artikeln anfangen und jeweils immer die Artikel z.B. Artikel1, Artikel2, ... in Artikeln drin haben.

Was ich bisher hinbekommen habe:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Artikeln>
<datum>88</datum>
<ean>1245</ean>
<abgeaufen>88</abgeaufen>
</Artikeln>

Würde besser aussehen:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Artikeln>
<Artikel1>
<datum>88</datum>
<ean>1245</ean>
<abgeaufen>88</abgeaufen>
</Artikel1>
</Artikeln>

Vielen Dank für eure Hilfestellung!


----------



## gorefest (27. September 2010)

Dazu müsstest Du afaik eine Klasse Artikeln haben die eine Collection oder Array von Artikel hat.

[edit] 
so geht das gar nicht.

was geht ist :


```
<Artikeln>
 <Artikel>
   <id>1</id>
   ....
 </Artikel>
 <Artikel>
   <id>2</id>
   ....
 </Artikel>
</Artikeln>
```


----------



## JAVAx (27. September 2010)

ich muss sql abfragen ... also ergebnisse von sql abfragen in eine xml datei schreiben. 

ich soll für jeden Artikel mehrere sachen abfragen und dann in die xml datei schreiben z.B.:

<Artikeln>
 <Artikel>
   <id>1</id>
   <...>...</...>
   <...>...</...>
   <...>...</...>
   <...>...</...>
 </Artikel>
 <Artikel>
   <id>2</id>
   <...>...</...>
   <...>...</...>
   <...>...</...>
   <...>...</...>
 </Artikel>
</Artikeln>

ich habe auch eine ausgabe hinbekommen, aber wie mache ich das mit allen artikeln****? also eine klasse erstellen habe ich verstanden...und dann?

vielen vielen dank


----------



## gorefest (27. September 2010)

naja, 

Du baust eine Klasse mit den von Dir benötigten Attributen und annotierst diese; soweit ich Dich verstanden habe, hast Du das auch schon gemacht.

Was Du noch brauchst ist eine annotierte Klasse Artikeln, die ein Array Artikel[] hat. 

Dieses Artikelarray füllst Du, indem Du einfach für jede Artikeldatenzeile, die Dein SQL liefert, eine Instanz von Artikel machst und selbige dann mit den Werten befüllst. Zum Schluss hängst Du die an das Arrays an.

Dann musst Du die Instanz von Artikeln nur noch in XML serialisieren und fertig; also das was Du oben bereits erwähnt hast.

Grüße
gore


----------



## JAVAx (27. September 2010)

gorefest hat gesagt.:


> naja,
> 
> Du baust eine Klasse mit den von Dir benötigten Attributen und annotierst diese; soweit ich Dich verstanden habe, hast Du das auch schon gemacht.



die attribute habe ich geschrieben aber nicht die annotationen.



gorefest hat gesagt.:


> Was Du noch brauchst ist eine annotierte Klasse Artikeln, die ein Array Artikel[] hat.



@XmlRootElement meinst du das?



gorefest hat gesagt.:


> Dieses Artikelarray füllst Du, indem Du einfach für jede Artikeldatenzeile, die Dein SQL liefert, eine Instanz von Artikel machst und selbige dann mit den Werten befüllst. Zum Schluss hängst Du die an das Arrays an.


die artikelids aus er datenbank herauslesen und dann in das array schreiben richtig?



gorefest hat gesagt.:


> Dann musst Du die Instanz von Artikeln nur noch in XML serialisieren und fertig; also das was Du oben bereits erwähnt hast.


serialisieren? wie ?

danke dir gorefest


----------



## gorefest (27. September 2010)

ungefähr so :


```
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"artikel"
})
@XmlRootElement(name = "artikeln")
public class Artikeln { 
   @XmlElement(name = "artikel")
   public List<Artikel> artikel= new ArrayList<Artikel>(); 
    .....
}
```

sowie


```
public static class Artikel {
  @XmlElement(name = "id")
     public Long id;
```

Diese Objekte erzeugst Du beim iterieren über Dein resultset und packst sie dann in die Artikeln-artikel-Collection.

Also irgendwas in der art


```
Artikeln n = new Artikeln();
 for (Object[] o : qry.DeineZeilen()) {
  Artikel x = new Artikel();
 x.id = (Long) o[ID_COL]; 
 ....
 n.getArtikel().add(x);
}
```

Das was dabei rauskommt, schickst Du dann an Deinen XML-Schreiber.

Grüße
gore


----------



## JAVAx (28. September 2010)

vielleicht eine blöde frage...aber: muss man mit objecten arbeiten. 
Ich bekomme die Strings von der Datenbank. Theoretisch könnte ich dich gleich doch reinschreiben in die Datei. Würden dann die Annot. nicht erkannt werden!?


----------



## gorefest (28. September 2010)

Also, 
Annotations werden von JaxB erkannt und dazu verwendet, um Objekte in XML zu packen (=marshalling).

Du kannst natürlich auch das XML direkt aus den Strings erzeugen. Dann kannst Du Dich aber auch um Quotierung etc pp kümmern. Du brauchst dann weder Klassen noch JAXB.

Allerdings ist ein Artikelpreis wohl kaum ein string ;-)

Der Vorteil von JAXB ist, dass Du etwas typsicher in XML und bei Bedarf auch wieder zurückbringst.

Grüße
gore


----------



## gorefest (29. September 2010)

Schritt 1 : Daten selektieren und Collection erzeugen


```
Artikeln alleArtikel = new Artikeln();
   Statement s = conn.createStatement ();
   s.executeQuery ("SELECT id, name, preis FROM artikel");
   ResultSet rs = s.getResultSet ();
   while (rs.next ())
   {  
      Artikeln art = new Artikeln();
      art.setId(rs.getId(1));
      art.setName(rs.getString(2));
      ....
      // den fertig aufgebauten Artikel kleben wir an Artikeln
     alleArtikel.add(art);
    }
}
```

Damit hast Du ein Objekt Artikeln erzeugt, dass eine Liste aller Artikel enthält. Diese Artikel wurden in der Schleife erzeugt. 

Schritt 2: Objekte in XML Datei schreiben:


```
JAXBContext context = JAXBContext.newInstance( Artikeln.class ); 
Marshaller m = context.createMarshaller(); 
m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE ); 
m.marshal( club, System.out );
Writer w = null; 
try { 
  w = new FileWriter( "alleArtikel.xml" ); 
  m.marshal( alleArtikel, w ); 
} 
finally { 
  try { w.close(); } catch ( Exception e ) { } 
}
```

ist ungetestet, geht aber. Ich empfehle Dir, mal hier einen Blick drauf zu werfen :

http://openbook.galileocomputing.de/javainsel8/javainsel_15_008.htm

sowie fürt SQL+java hier 

http://openbook.galileocomputing.de...23_006.htm#mjd946cabe2b84a19aa815b0b2c42ce9da

Grüße
gore


----------



## JAVAx (29. September 2010)

vielen dank für deine hilfe, dass hat mir schon sehr viel weitergeholfen.

wie könnte die .add(art); methode für das object aussehen?

es werden also 2 mal die gleichen objecte erstellt?


----------



## gorefest (29. September 2010)

da artikeln eine collection<Artikel> enthält, brauchst Du Dich gar nicht darum kümmern, da in diesem Fall die ArrayList<Artikel> die add-Methode enthält. Es wird nur ein Objekt erstellt, dessen Referenz in die Collection eingetragen wird (eben per add())

Grüße
gore


----------



## JAVAx (29. September 2010)

ich bedanke mich ganz herzlich gorefest


----------



## JAVAx (29. September 2010)

es kommt immer die fehlermeldung 

cannot find symbol method add(...)


----------



## gorefest (30. September 2010)

u.a. ist Freestyle. Ich denke, daß Du einfach vergessen hast, das Field in Artikeln nicht public zu machen bzw. die AddMethode des Fields zu rufen (nicht artikeln.add, sondern artikeln.meineArtikel.add())



```
public class Artikeln {
 public Collection<Artikel> meineArtikel = new ArrayList<Artikel>(); 
 ...
 public Collection<Artikel> getMeineArtikel(){ return meineArtikel; }
}

// dein code ...
Artikeln alleArtikel = new Artikeln();
Artikel a = new Artikel();

// ... (artikel befüllen) ..

// Zugriff über Field
alleArtikel.meineArtikel.add(a);

// Zugriff über getter
alleArtikel.getMeineArtikel().add(a);
```

Wichtig : Bei Fieldzugriff muss die Membervariable meineArtikel public sein


----------



## JAVAx (30. September 2010)

vielen dank für eure hilfe****** es hat alles wunderbar geklappt )

wenn einer hilfe benötigt pn...


----------

