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
Tutorial gesucht: Base Datenbank zu XML exportieren
Moderator: Moderatoren
Re: Tutorial gesucht: Base Datenbank zu XML 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.samsa hat geschrieben:Wie kann ich meine Tabelle als XML aus Base heraus exportieren?
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>
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
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
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.