Seite 1 von 2
xml export
Verfasst: Mo 20. Jul 2015, 15:57
von elefantino
Hallo, ich möchte einen Datensatz einer Base Datenbank in eine XML Datei eportieren. Funktioniert auch fast alles.
Die XML Datei muß allerdings ein bestimmtes Format haben, und da komme ich nicht weiter. Vielleicht kann mir jemand helfen.
Mein Code bisher:
Code: Alles auswählen
Sub ExportX
Dim oleService, oXMLexp as Object, oXMLimp as Object
Dim oRoot, oNode, oFatturaElettronicaHeader as Object
DIM oDoc AS OBJECT
DIM oDrawpage AS OBJECT
DIM oForm AS Object
Dim sNome As string
oDoc = thisComponent
oDrawpage = oDoc.Drawpage
oForm = oDrawpage.Forms.getByName("Besitzer")
sNome = oForm.getByName("txtNome").CurrentValue
oleService = createUnoService("com.sun.star.bridge.OleObjectFactory")
' Create an XML object to export
oXMLexp = oleService.createInstance("Msxml.DOMDocument")
With oXMLexp
.async = true
.validateOnParse = true
.resolveExternals = true
oRoot = .createElement("p:FatturaElettronica")
oRoot.nodeTypedValue = ""
.appendChild(oRoot)
oFatturaElettronicaHeader = .createElement("Name")
oFatturaElettronicaHeader.nodeTypedValue = "" & sNome
oRoot.appendChild(oFatturaElettronicaHeader)
.Save("C:\Dati\Fattura\test.xml")
End With
End Sub
Das ergibt dann die Ausgabe:
<p:FatturaElettronica><Name>xxxxxx</Name></p:FatturaElettronica>
Die Datei sollte aber so aussehen:
<?xml version="1.0" encoding="UTF-8"?>
<p:FatturaElettronica versione="1.1" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:p="http://www.xxxxxxxxx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<FatturaElettronica>
<Name>xxxxxx</Name>
</p:FatturaElettronica>
Bin für Hilfe dankbar
Re: xml export
Verfasst: Mo 20. Jul 2015, 17:07
von RobertG
Hallo elefantino,
suchst Du jetzt nach einer Möglichkeit, den "Vorspann" vor den Dateninhalt zu setzen?
Oder suchst Du nach der Möglichkeit, jeweils Zeilenumbrüche einzubauen?
Ich würde einmal mit
xray oXMLexp
nachsehen, welche Methoden Dir zur Verfügung stehen. Da dürfte neben .createElement noch die Möglichkeit stehen, einen Vorspann hinzuzufügen.
Gruß
Robert
Re: xml export
Verfasst: Mo 20. Jul 2015, 19:51
von elefantino
Danke für die schnelle Antwort.
Ich habe das mit dem xray tool mal probiert, allerdings bekomme ich nur die Meldung (Leerer Datenwert (empty). Ich bin mir aber auch nicht sicher, ob ich das Teil richtig bediene, auch wenn es einfach zu sein scheint

.
Wenn möglich wäre es schön, dass sowohl der "Vorspann", als auch die Zeilenumbrüche eingefügt werden.
Nochmal Danke
Nachtrag: Ich konnte soeben einen Teil lösen, hier der Code:
Code: Alles auswählen
...
oRoot = .createElement("p:FatturaElettronica")
oRoot.setAttribute("Versione", "1.1")
oRoot.setAttribute("xmlns:ds", "http://www.w3.org/2000/09/xmldsig#")
oRoot.setAttribute("xmlns:p", "http://www.xxxx")
oRoot.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance")
...
Das ergibt dann die Ausgabe:
<p:FatturaElettronica Versione="1.1" xmlns:ds="
http://www.w3.org/2000/09/xmldsig#" xmlns:p="
http://www.xxxx" xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instan ... lettronica>
Re: xml export
Verfasst: Di 21. Jul 2015, 10:40
von RobertG
Hallo elefantino,
da muss ich leider passen. Ich habe das gerade versucht zu testen, bin aber mangels Windows bereits an der Zeile oXMLexp = oleService.createInstance("Msxml.DOMDocument") gescheitert.
Das wird auch der Grund sein, warum xray nichts weiter auswirft. Es wird da ein Element eingebunden, das nicht zur API von LibreOffice gehört und auf das kein Zugriff besteht.
Hilft also nichts als das Testen der üblichen Verdächtigen für einen Zeilenumbruch: <br />, \n, \r ...
Gruß
Robert
Re: xml export
Verfasst: Di 21. Jul 2015, 16:13
von elefantino
Hallo Robert,
Trotzdem Danke fürs versuchen

. Kennst Du eine andere Möglichkeit, eine XML Datei in dem Format zu erzeugen?
Oder eine Textdatei zu schreiben, dann Tippe ich halt alle start/ende Tags manuell ein ...
Re: xml export
Verfasst: Di 21. Jul 2015, 17:29
von RobertG
Hallo elefantino,
ich habe gerade für das neue Handbuch ein Kapitel erstellt gehabt, bei dem aus einem *.pdf-Formular Daten in eine Textdatei übertragen wurden und anschließend in eine Datenbank eingelesen werden. Da ist, wenn auch etwas versteckt, der Teil mit drin, in dem die Textdatei erstellt wird. Ich hänge einfach einmal das Beispiel an.
Du musst auf jeden Fall mit
inNumber = FreeFile
beginnen ...
Ich kenne mich mit XML nicht genügend aus um sagen zu können, ob ein entsprechendes Datenformat allegmeingültig ist. Ansonsten würde ich das selbst schreiben ...
Gruß
Robert
Re: xml export
Verfasst: Mi 22. Jul 2015, 09:33
von RobertG
Hallo elefantino,
ich habe mir das jetzt noch einmal angesehen. Das Beispiel, das ich vorher zum Einlesen von pdf-Dateien angehängt habe, passt gar nicht. Ich habe einmal einen grundlegenden Aufbau zusammen gestellt, der erst einmal ohne Datenbankanbindung funktioniert: Es wird eine Textdatei geschrieben, die einem xml-Aufbau (vermutlich) entspricht:
Code: Alles auswählen
SUB XML_create
DIM stStart AS STRING
DIM stFolder AS STRING
DIM stTitle AS STRING
DIM stRow AS STRING
DIM arFields()
DIM arFieldsContent()
DIM oFileAccess AS OBJECT
DIM oFile AS OBJECT
DIM oDB AS OBJECT
DIM stDir AS STRING
DIM oOutputStream AS OBJECT
stStart = "<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>"
stFolder = "folder"
stTitle = "title"
stTitleContent = "persons"
stRow = "entry"
arFields = Array("forename","surname")
arFieldsContent = Array("Robert","Großkopf")
oDB = ThisComponent
stDir = Left(oDB.Location,Len(oDB.Location)-Len(oDB.Title))
oFileAccess = createUnoService("com.sun.star.ucb.SimpleFileAccess")
IF oFileAccess.exists(stDir & "xmlexport.txt") THEN
oFileAccess.move(stDir & "xmlexport.txt", stDir & "xmlexport.bak")
END IF
oFile = oFileAccess.openFileWrite(stDir & "xmlexport.txt")
oOutputStream = createUnoService("com.sun.star.io.TextOutputStream")
oOutputStream.setOutputStream(oFile)
oOutputStream.writeString(stStart & CHR(13) & CHR(10) & "<" & stFolder & ">" & CHR(13) & CHR(10))
oOutputStream.writeString("<" & stTitle & ">" & stTitleContent & "</" & stTitle & ">" & CHR(13) & CHR(10))
oOutputStream.writeString("<" & stRow & ">" & CHR(13) & CHR(10))
FOR i = LBound(arFields) TO UBound(arFields)
oOutputStream.writeString("<" & arFields(i) & ">" & arFieldsContent(i) & "</" & arFields(i) & ">" & CHR(13) & CHR(10))
NEXT
oOutputStream.writeString("</" & stRow & ">" & CHR(13) & CHR(10))
oOutputStream.writeString("</" & stFolder & ">")
oOutputStream.closeOutput()
END SUB
Willst Du so ein Makro aus dem Formular heraus starten, so ist statt
oDB = ThisComponent
oDB = ThisComponent.Parent
einzufügen.
Das Auslesen der Daten sollte dann das Array ersetzen, in dem im Moment fest mein Name geschrieben steht.
Gruß
Robert
Re: xml export
Verfasst: Mi 22. Jul 2015, 21:46
von RobertG
Ich habe noch etwas nachgelegt: Eine Datenbank, bei der Daten in eine XML-Datei exportiert werden können (einzelne Datensätze oder alle Datensätze unter Berücksichtigung der Filterung im Formular).
Aus einer Datei mit gleichem Aufbau können auch Datensätze importiert werden.
Ich hänge das einmal an. Vielleicht wird daraus ja eine Beispieldatenbank für meine Sammlung ...
Gruß
Robert
Re: xml export
Verfasst: Do 23. Jul 2015, 10:15
von elefantino
Hallo Robert, zuerst mal vielen Dank, dass Du nicht locker läßt, und Deine Zeit investierst

. So schnell konnte ich die verschiedenen Lösungen noch gar nicht testen

.
Dein letzter Vorschlag mit der Datenbank Beispieldatei ist ja schon sehr gut, und brauchbar.
Trotzdem habe ich ehrlich gesagt noch nicht so richtig verstanden, wieso es so schwierig ist, einen Export als XML Datei zu machen, ich dachte, OpenOffice/Libreoffice basiert auf XML Dateien. Es scheint sich allerdings auch sonst nicht wirklich jemand für dieses Thema zu interessieren.
Nach weiterem Suchen habe ich im OpenOffice Forum noch dieses gefunden:
http://de.openoffice.info/viewtopic.php ... ds#p255366
Dieses Makro ist allerdings in Python geschrieben, davon verstehe ich nun aber noch weniger als von Basic.
Danke nochmals für Deine Mühe
Ciao
Mario
Re: xml export
Verfasst: Sa 25. Jul 2015, 16:42
von elefantino
Für alle, die das Thema XML Export doch noch interessiert - ich habe noch ein stückchen gefunden, das die Declaration am Beginn der Datei macht:
Code: Alles auswählen
...
With oXMLexp
.async = false
.validateOnParse = false
.resolveExternals = false
.appendChild .createProcessingInstruction( _
"xml", _
"version=""1.0"" encoding = ""UTF-8"" standalone=""yes""")
...
Das ergibt dann diese Ausgabe:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Wenn es jetzt noch gelingt, die Zeilenumbrüche zu machen, dann würde man das ganze auch vernünftig lesen können. Spielt aber für die Datei keine Rolle.