Seite 1 von 1

Tutorial gesucht: Base Datenbank zu XML exportieren

Verfasst: So, 28.12.2008 12:22
von samsa
Hallo,

Ich suche eine Anleitung oder ein Tutorial, wie man eine einfache Tabelle einer Base-Datenbank in eine XML-Datei exportiert.

- Nach 2 Stunden Suche im Internet habe ich leider immer noch nichts gefunden.

- Auch das Entpacken der Zip-Datei der abgespeicherten Datenbank hat nichts gebracht, da 'content.xml' nicht den Inhalt der Tabelle enthält. Ich bräuchte den Inhalt, der in der Zip-Datei unter "database" abgelegt ist, also die wirklichen Daten, den echten Inhalt der Tabelle.

- In der mitgelieferten Hilfe steht zum Thema XML immer nur etwas vom Writer. Von OpenOffice habe ich aber in Moment nur Base installiert, nicht die anderen Programme (Writer, Calc usw.), da ich diese nicht brauche. Mit der Hilfe komme ich also auch nicht weiter.

Ich brauche einfach nur Standard-XML, keine Anpassung via XSLT nötig.
Wie kann ich meine Tabelle als XML aus Base heraus exportieren?

Vielen Dank!

Sandra

Re: Tutorial gesucht: Base Datenbank zu XML exportieren

Verfasst: Mi, 31.12.2008 13:58
von hol.sten
samsa hat geschrieben:Wie kann ich meine Tabelle als XML aus Base heraus exportieren?
Bisher habe ich keine einfache Methode gefunden, um mal eben aus einer Base-Tabelle alle Daten als XML zu extrahieren. Die von OOo Base intern verwendete Datenbank HSQLDB speichert seine Daten nicht im XML-Format. Daher bringt es auch nichts, OOo Base-Dateien zu entpacken.

Verwundert war ich auch von OOo Base Queries, dass es wohl keine einfache Methode gibt, mal eben das Ergebnis einer Query als Text zu speichern. Dann sollte es reichen, um den Tabelleninhalt als XML-zu formatieren, eine entsprechende SQL-Query zu starten und das Ergebnis als Text zu speichern.

Beispiel: Eine einfache Tabelle names habe die Spalten id und name.
SQL-Query: select '<row>'as "<row>",'<id>'as "<id>","id",'</id>'as "</id>",'<name>'as "<name>","name",'</name>'as "</name>",'</row>'as "</row>" from "names"
Das Ergebnis der SQL-Query sieht dann schon sehr nach XML aus:

Code: Alles auswählen

<row>	<id>	id	</id>	<name>	name	</name>	</row>
<row>	<id>	1	</id>	<name>	meier	</name>	</row>
<row>	<id>	2	</id>	<name>	schmidt	</name>	</row>
<row>	<id>	3	</id>	<name>	pan	</name>	</row>
<row>	<id>	4	</id>	<name>	plaschke	</name>	</row>
<row>	<id>	5	</id>	<name>	reiher	</name>	</row>
Mit Hilfe von OOo Calc kann man das Ergebnis dann aber doch als Text speichern. Dazu startet man OOo Calc, drückt F4 (Data Source) um die in OOo registrierten Datenbanken anzuzeigen, klickt sich zur OOo Base SQL-Query durch und zieht diese bei gedrückter linker Maustaste einfach in die Zelle A1 der OOo Calc-Tabelle. Nach kurzer Zeit wird dann das Ergebnis der SQL-Query in OOo Calc angezeigt.

Das Speichen als Textdatei aus OOo Calc sieht aber dank des CSV-Formats auch nicht so ganz klasse aus. Sollte es dennoch reichen, hat man den gewünschten XML-Inhalt.



Wenn es etwas komfortabler sein soll, hat man in OOo Calc folgende Alternativen:

XML Export Filter
Wie hier beschrieben [XML Filter] Create XSLT filters for import and export: http://user.services.openoffice.org/en/ ... slt+filter bastelt man sich einen einfachen XML Export Filter, der die gewünschte XML-Datei erzeugt. Bei dieser Vorgehensweise kann man natürlich auch ohne SQL-Query zum gewünschten Ergebnis kommen. Dazu klickt sich in der Data Source statt zur OOo Base SQL-Query zur gewünschten OOo Base Tabelle durch und zieht diese bei gedrückter linker Maustaste einfach in die Zelle A1 der OOo Calc-Tabelle.

OOo Calc Macro
Mit Hilfe eines OOo Basic Macros speichert man das Ergebnis der SQL-Query in einer XML-Datei ab. Dazu taugt z. B. folgendes OOo Basic Makro:

Code: Alles auswählen

REM  *****  BASIC  *****


Sub Main


  Dim XML_FILE_NAME As String

  XML_FILE_NAME = "c:\CalcExport.xml"


  Dim XML_DECLARATION As String
  Dim ROOT_START_TAG As String
  Dim ROOT_END_TAG As String

  XML_DECLARATION = "<?xml version=""1.0""?>"
  ROOT_START_TAG  = "<rows>"
  ROOT_END_TAG    = "</rows>"


  Dim document As Object
  Dim xmlContent As String

  document = StarDesktop.CurrentComponent
  xmlContent = GetXmlContent(document.sheets(0))


  Dim xmlFileContent As String

  xmlFileContent = XML_DECLARATION + ROOT_START_TAG + xmlContent + ROOT_END_TAG
  SaveXmlFile(xmlFileContent, XML_FILE_NAME)


End Sub


Function GetXmlContent(sheet As Object)


  Dim xmlContent As String

  xmlContent = ""


  Dim rowIsEmpty As Boolean
  Dim columnIsEmpty As Boolean

  Dim row As Integer
  Dim column As Integer

  row = 1
  column = 0


  Dim cell As Object

  Do

    cell = sheet.getCellByPosition(column,row)
    If cell.type <> com.sun.star.table.CellContentType.EMPTY Then

      rowIsEmpty = False

      Do

        cell = sheet.getCellByPosition(column,row)
        If cell.type <> com.sun.star.table.CellContentType.EMPTY Then

          columnIsEmpty = False

          cell = sheet.getCellByPosition(column,row)
          xmlContent = xmlContent + cell.string

        Else
          columnIsEmpty = True
        End If

        column = column + 1

      Loop Until columnIsEmpty

      row = row + 1
      column = 0

    Else
      rowIsEmpty = True
    End If

  Loop Until rowIsEmpty


  GetXmlContent = xmlContent


End Function


Sub SaveXmlFile(xmlFileContent As String, xmlFileName As String)


  Dim xmlFileHandle As Integer

  xmlFileHandle = FreeFile


  Open xmlFileName For Output As #xmlFileHandle
  Print #xmlFileHandle, xmlFileContent
  Close #xmlFileHandle


End Sub
Hier sollte man dann noch die Konstanten XML_FILE_NAME, ROOT_START_TAG und ROOT_END_TAG an die eigenen Vorstellungen anpassen.

Das Makro fängt in der zweiten Zeile des ersten OOo Calc Spreadsheets an, fasst alle gefüllten Zeilen und Spalten bis zur ersten Zeile, in der die erste Spalte nicht gefüllt ist, zu einem Textstring zusammen, verpackt das Ganze in XML_DECLARATION, ROOT_START_TAG und ROOT_END_TAG und speichert das Ergebnis dann als Textdatei.



Und es geht auch ganz ohne OOo Calc:

OOo Base Macro
Nachdem es mir mit dem OOo Calc Macro gelungen war, einzelne Tabellen als XML zu speichern, habe ich dies direkt aus OOo Base heraus versucht. Auch das geht und man spart sich den Umweg über OOo Calc. Zumindest mein OOo Portable 3.0.0 stürzte aber regelmässig ab, wenn ich das Makro auf nicht registrierte OOo Base Dateien losgelassen habe. Ich habe noch nicht ausprobiert, ob OOo 3.0.0 ähnlich launisch ist. Mit folgendem OOo Base Macro hat das Speichern von XML-Dateien aber zumindest bei registrierten OOo Base Dateien funktioniert:

Code: Alles auswählen

REM  *****  BASIC  *****

Sub Main


  Dim XML_FILE_NAME As String

  XML_FILE_NAME = "c:\BaseExport.xml"


  Dim DATABASE_NAME As String

  DATABASE_NAME = "ExampleDatabase"


  Dim SQL_QUERY As String

  SQL_QUERY = "select '<row>'as ""<row>"",'<id>'as ""<id>"",""id"",'</id>'as ""</id>"",'<name>'as ""<name>"",""name"",'</name>'as ""</name>"",'</row>'as ""</row>"" from ""names"""


  Dim XML_DECLARATION As String
  Dim ROOT_START_TAG As String
  Dim ROOT_END_TAG As String

  XML_DECLARATION = "<?xml version=""1.0""?>"
  ROOT_START_TAG  = "<rows>"
  ROOT_END_TAG    = "</rows>"


  Dim connection As Object
  Dim xmlContent As String

  connection = GetConnection(DATABASE_NAME)
  xmlContent = GetXmlContent(connection, SQL_QUERY)


  Dim xmlFileContent As String

  xmlFileContent = XML_DECLARATION + ROOT_START_TAG + xmlContent + ROOT_END_TAG
  SaveXmlFile(xmlFileContent, XML_FILE_NAME)


End Sub


Function GetXmlContent(connection As Object, sqlQuery As String)


  Dim xmlContent As String

  xmlContent = ""


  Dim statement As Object
  Dim resultSet As Object


  statement = connection.createStatement()
  resultSet = statement.executeQuery(sqlQuery)

  If Not IsNull(resultSet) Then

    While resultSet.next
      For i = 1 To resultSet.Columns.Count
        xmlContent = xmlContent + resultSet.getString(i)
      Next
    Wend

  End If


  GetXmlContent = xmlContent


End Function


Function GetConnection(databaseName As String)


  Dim databaseContext As Object
  Dim dataSource As Object
  Dim connection As Object
  Dim interactionHandler as Object

  databaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
  dataSource = databaseContext.getByName("ExampleDatabase")

  If Not dataSource.IsPasswordRequired Then
    connection = dataSource.GetConnection("","")
  Else
    interactionHandler = createUnoService("com.sun.star.sdb.InteractionHandler")
    connection = dataSource.ConnectWithCompletion(InteractionHandler)
  End If

  GetConnection = connection


End Function


Sub SaveXmlFile(xmlFileContent As String, xmlFileName As String)


  Dim xmlFileHandle As Integer

  xmlFileHandle = FreeFile


  Open xmlFileName For Output As #xmlFileHandle
  Print #xmlFileHandle, xmlFileContent
  Close #xmlFileHandle


End Sub
Hier sollte man dann noch die Konstanten XML_FILE_NAME, DATABASE_NAME und SQL_QUERY an die eigenen Vorstellungen anpassen.

SQL_QUERY enthält auf den ersten Blick ziemlich viele " bzw. "". Das liegt daran, das HSQLDB bei klein geschriebenen Attributnamen auf einfachen Anführungszeichen besteht und einfache Anführungszeichen in OOo Basic Macros in Zeichenketten mit doppelten Anführungszeichen dargestellt werden müssen.

Das Makro stellt eine Connection zur angegebenen OOo Base Datei her, erzeugt per SQL-Query ein Resultset, fasst alle Werte im Resultset zu einem Textstring zusammen, verpackt das Ganze in XML_DECLARATION, ROOT_START_TAG und ROOT_END_TAG und speichert das Ergebnis dann als Textdatei.



Ich hoffe, dass zumindest eine dieser Methoden hilfreich ist.