# XML einlesen und in Datenbank schreiben



## boiler (21. Mrz 2009)

hi,
ich erhalte die XML Datei von der API des Spiels EveOnline 
Jetzt will ich diese XML Datei irgendwie einlesen und die Werte in eine Datenbank schreiben. 

Wenn das geschafft ist werde ich die Datenbankinhalte für mich in eine Swinganwendung reinpacken und ausgeben.

Das einzige  Problem ist, ich hab keine Ahnung wie ich die xml Datei (welche ich bereits per HTTP geholt habe und local gespeichert habe) in eine Datenbank schreibe...

Hier ist wie die XML Datei aussieht
[highlight=XML]
<?xml version='1.0' encoding='UTF-8'?>
<eveapi version="2">
  <currentTime>2009-03-21 13:39:49</currentTime>
  <result>
    <rowset name="transactions" key="transactionID" columns="transactionDateTime,transactionID,quantity,typeName,typeID,price,clientID,clientName,stationID,stationName,transactionType,transactionFor">
      <row transactionDateTime="2009-02-20 16:36:00" transactionID="888805435" quantity="16" typeName="1400mm Howitzer Artillery I Blueprint" typeID="833" price="13500000.00" clientID="1000051" clientName="Republic Fleet" stationID="60004903" stationName="Amo VIII - Moon 2 - Republic Fleet Assembly Plant" transactionType="buy" transactionFor="corporation" />
      <row transactionDateTime="2009-02-20 16:35:00" transactionID="888804815" quantity="16" typeName="1200mm Artillery Cannon I Blueprint" typeID="832" price="10800000.00" clientID="1000051" clientName="Republic Fleet" stationID="60004903" stationName="Amo VIII - Moon 2 - Republic Fleet Assembly Plant" transactionType="buy" transactionFor="corporation" />
      <row transactionDateTime="2009-02-20 05:04:00" transactionID="888410293" quantity="1" typeName="Expanded Cargohold I" typeID="1317" price="1110.01" clientID="1896316358" clientName="ooblah413" stationID="60011719" stationName="Chelien IV - Moon 20 - Federal Administration Information Center" transactionType="sell" transactionFor="personal" />
      <row transactionDateTime="2009-02-19 20:00:00" transactionID="887943384" quantity="2" typeName="Expanded Cargohold I" typeID="1317" price="1110.01" clientID="1247542491" clientName="Anasazi007" stationID="60011719" stationName="Chelien IV - Moon 20 - Federal Administration Information Center" transactionType="sell" transactionFor="personal" />
      <row transactionDateTime="2009-02-19 18:01:00" transactionID="887832408" quantity="1" typeName="Expanded Cargohold I" typeID="1317" price="1110.01" clientID="1868908427" clientName="" stationID="60011719" stationName="Chelien IV - Moon 20 - Federal Administration Information Center" transactionType="sell" transactionFor="personal" />
      <row transactionDateTime="2009-02-19 12:23:00" transactionID="887590587" quantity="1" typeName="Dual Heavy Pulse Laser I Blueprint" typeID="844" price="4217999.13" clientID="358954236" clientName="Milluardo Peacecraft" stationID="60003760" stationName="Jita IV - Moon 4 - Caldari Navy Assembly Plant" transactionType="sell" transactionFor="corporation" />
      <row transactionDateTime="2009-02-19 07:14:00" transactionID="887451167" quantity="1" typeName="Expanded Cargohold I" typeID="1317" price="1110.01" clientID="1612493492" clientName="Dizbin" stationID="60011719" stationName="Chelien IV - Moon 20 - Federal Administration Information Center" transactionType="sell" transactionFor="personal" />
      <row transactionDateTime="2009-02-19 07:00:00" transactionID="887442771" quantity="1" typeName="Expanded Cargohold I" typeID="1317" price="10000.00" clientID="1612493492" clientName="Dizbin" stationID="60011719" stationName="Chelien IV - Moon 20 - Federal Administration Information Center" transactionType="sell" transactionFor="personal" />
    </rowset>
  </result>
  <cachedUntil>2009-03-21 13:54:49</cachedUntil>
</eveapi>

[/highlight]

ich will z.b. die transactionID als eine Spalte mir Primärschlüssel machen


----------



## SvenK (21. Mrz 2009)

XML einlesen ist relativ einfach
[highlight=Java]
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;

DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();            
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document doc = docBuilder.parse (new File("book.xml"));
[/highlight]

Dann kannst du über das Document DOM-Abfragen machen und die Informationen (Name, Attribute usw) der gefunden Elemente auslesen
[highlight=Java]
NodeList listOfRows = doc.getElementsByTagName("row");
for (int s = 0; s < listOfRows.getLength(); s++) {
Element element = (Element) listOfRows.item(s);
...
}
[/highlight]

Die Übergabe an die Datenbank ist ähnlich simpel. Was du erst einmal brauchst, ist der passende JDBC-Treiber für dein DBMS. Findest du alles im Netz.

Dann baust du zuerst eine Verbindung zur Datenbank auf.
[highlight=Java]
               Connection con = DriverManager.getConnection("jdbc:myDriver:wombat", "myLogin", "myPassword");
[/highlight]
Und dann kannst du schon loslegen und deine XML-Daten hinzuzufügen. Folgendes könntest du in die obige for-Schleife schreiben
[highlight=Java]
PreparedStatement stmt = con.prepareStatement("INSERT INTO eve_row (transactionID, transactionDateTime, quantity) VALUES (?, ?, ?)");

stmt.setString(1, element.getAttribute("transactionID"));
stmt.setString(2, element.getAttribute("transactionDateTime"));
stmt.setInt(3, Integer.parseInt(element.getAttribute("quantity")));

stmt.executeUpdate();
[/highlight]
Die Tabelle hätte demzufolge 3 Spalten, die entsprechend den XML-Attributen benannt wurde. Wie du das bei dir konkret machst, bleibt dir überlassen.

Du könntest die SQL-Statements auch erst einmal sammeln (in einer Liste zBsp) und später zentral ausführen (foreach über Liste und executeUpdate für jedes Statement)


----------

