Domino 9 und frühere Versionen > ND6: Entwicklung
XML Datei generieren
Axel Janssen temp:
was heisst von Hand?
Der einfachste Weg in Domino/LotusScript ist IMHO:
1. Schritt: Datei im Filesystem erzeugen.
2. Schritt: xml-Header + öffnenden root-Tag in Datei schreiben:
--- Code: ---<?xml version='1.0' encoding='UTF-8'?>
<MAIL>
--- Ende Code ---
3. Schritt: Einzelne Felder aus Notes-Dokument auslesen. (bekanntes doc.ItemName(0)) und in das xml-file schreiben:
"<Name>" + doc.Name(0) + "</Name>" in xml file schreiben.
4. Schritt: Root-tag schliessen:
--- Code: ---</MAIL>
--- Ende Code ---
5. Schritt: XML - file schliessen.
Notes bietet die 2 Standard APIs an. Dom und Sax. Mit Sax kannst du keine Dokumente schreiben sondern nur lesen (gilt für alle SAX-Implementierungen, nicht Domino spezifisch). Mit Dom ginge es, ist aber relativ aufwendig. In xml-Welt benutzt man immer stärker Dinge, die auf einem höheren Abstraktionslevel ansetzen und somit einfacher sind. Z.B. JDOM.
Tipp: benutze nicht encoding="UTF-8" sondern "ISO-8859-1". Mit UTF-8 gibt es Probleme mit europäischen Sonderzeichen wie deutschen Umlauten oder spanischen enjes. Warum das so ist hab ich auch noch nicht so richtig verstanden.
Gruß Axel
Hevelmann:
Ich habe einen ganz anderen Ansatz.
Ich arbeite mit XSL StyleSheets und mit den Klassen NotesDXLExporter und NotesXSLTransformer. Soll heißen ich hab eine View mit einem Doc, indem der XSL StyleSheet steht. Mein Agent holt sich den Inhalt ( XSLstyleSheet ) und packt den in einen NotesStream dann hole ich das Notesdokument (Auto) und lade es per NotesDXLExporter auch in einen NotesStream. Dann erstelle ich einen dritten Stream (für Export ins Filesystem). Mit der Transformerklasse wandle ich also Stream1 (Auto) mit Hilfe von Stream2 (XSL SyleSheet) in Stream3 (Filesystem) um.
Ich weiss alles etwas kompliziert. Ich hab Dir mal schnell ne DB erstellt, die Dir die ganze Geschichte erklären kann.
Schau Sie Dir einfach mal an.
Im Dokument (Car.xsl) zu finden in der View XSL StyleSheet findest Du den XSL StyleSheet. Du musst, den roten Eintrag (Cars) entsprechend umbennen. Also in den Feldnamen, der Deine Fahrzeugbeschreibungen enthält.
Dann dürfte alles klappen.
Im Moment werden die ganzen xml Dateien, die Du erstellst unter C:/Temp abgelegt.
Schaus Dir halt mal an.
Gruss Hevelmann
Don Pasquale:
@Hevelmann
Ja, alle Dokumente aus einer Sicht
@Axel J temp
Danke für den Tipp, aber genau dass ist ja der Clou,
ich muss die Dokumente in UTF-8 bringen und deswegen
wäre mir eine NotesKlasse lieber auf die Ich zugreifen kann.
Bisher benutze ich eine eigene Funktion string2xml
die mir die Sonderzeichen wie
& in ß konvertiert.
Ich habe nur die befürchtung, mir könnte ein Sonderzeichen durch die Lappen gegangen sein.
Das ist mein bisheriger Code ( nur ein Auszug)
Er funktioniert und darüber soll hier keine Diskussion stattfinden.
Ich hätte gerne, dass Lotus mir die UTF-8 konformität abnimmt.
geht das irgendwie mit Lotus 6 LotusScript Klassen ?
Ciao
Don Pasquale
Dim REGISTERNAME As String
Dim ABLAGEVERZEICHNIS As String
Dim STICHWORT As Variant
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = ws.CurrentDocument
Dim session As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Set db = session.CurrentDatabase
Dim user As String
user = session.UserName
Set profildoc = db.GetProfileDocument( "e4frm_DBProfil" )
ABLAGEVERZEICHNIS = profildoc.e4profil_CeArcDir(0)
Pfad$ = ABLAGEVERZEICHNIS + "\docinfo.xml"
Set db = session.CurrentDatabase
Set doc = db.GetDocumentByUNID(unid)
If Not doc Is Nothing Then
temp=Freefile()
Open Pfad$ For Output As temp
Print #temp,"<?xml version='1.0' encoding='ISO-8859-1'?>"
Print #temp,"<e4IHK>"
Print #temp,"<TABLE>" + "FIRMENAKTE"
Call Column(temp, "DOC_DATUM",doc.e4ihk_DOC_DATUM(0),"Date")
Call Column(temp,"EXTENDED_ATTR2",doc.e4ihk_EXTENDED_ATTR2(0),"String")
...... ( weitere Felder )
Print #temp,"</TABLE>"
Print #temp,"</e4IHK>"
Close temp
Sub COLUMN (temp As Variant, CName As String, CValue As String, CType As String)
' FUNKTION COLUMN
' Don Pasquale
' 22.01.2003
CValue = string2xml(CVALUE)
Print #temp,"<COLUMN>"
Print #temp,"<NAME>" & CNAME & "</NAME>"
Print #temp,"<VALUE>" & CValue & "</VALUE>"
Print #temp,"<TYPE>" & CType & "</TYPE>"
Print #temp,"</COLUMN>"
End Sub
Public Function string2xml(Byval strWert As String) As String
On Error Resume Next
' # Maskieren von Sonderzeichen (HTML-Konform) zum Schreiben in die XML-Datei
strWert = ReplaceSubstring(strWert, "&", "&")
strWert = ReplaceSubstring(strWert, "<", "<")
strWert = ReplaceSubstring(strWert, ">", ">")
strWert = ReplaceSubstring(strWert, Chr$(34), """)
string2xml = ReplaceSubstring(strWert, "'", "'")
End Function
Don Pasquale:
@Hevelmann
Bingo !
Das ist es was ich suche. Ich habe zwar noch nicht verstanden wie das funktioniert und wo ich anfangen soll, aber immerhin es gibt einen Weg. Vielen Dank.
Wie erstelle ich denn nun die XSL Datei, woher weiss Lotus, welches Feld zu welchem tag gehört ?
Ciao
Don Pasquale
Hevelmann:
mit dem Exporter erstellst Du ein XML Dokument, das so aussehen kann:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE document SYSTEM 'xmlschemas/domino_6_0.dtd'>
<document xmlns="http://www.lotus.com/dxl" version="6.0" replicaid="C1256D9600262909" form="fmCars">
<noteinfo noteid="8f6" unid="6C242E2FABB94DD9C1256D9600267984" sequence="1">
<created>
<datetime dst="true">20030903T090014,76+02</datetime>
</created>
<modified>
<datetime dst="true">20030903T090021,59+02</datetime>
</modified>
<revised>
<datetime dst="true">20030903T090021,58+02</datetime>
</revised>
<lastaccessed>
<datetime dst="true">20030903T090021,58+02</datetime>
</lastaccessed>
<addedtofile>
<datetime dst="true">20030903T090021,58+02</datetime>
</addedtofile>
</noteinfo>
<updatedby>
<name>CN=Max Mustermann/O=Musterfirma/C=DE</name>
</updatedby>
<item name="Cars">
<text>VW Käfer</text>
</item>
</document>
Dieses Dokument wird also in den Stream (streamin) geschrieben
(Set exporter = session.CreateDXLExporter ( nDoc, streamin )
Call exporter.process ()
nDoc ist Dein Dokument mit den Autos.
Mittels der Transformerklasse
(Set transformer = session.CreateXSLTransformer ( streamin, streamXSL, streamOut )
Call transformer.Process ())
wird also das erstellte XML Dokument (Autos) mit Hilfe des Stylesheets (wurde in streamXSL geladen) in deine Ausgabedatei umgewandelt. Dabei wird mit Hilfe des Stylesheets geschaut, ob es im XMLDokument (Autos) ein Tag "item" mit dem Attribut "Names" und dem Wert "Cars" gibt (<item name="Cars"><text>VW Käfer</text></item>), wenn es das gibt wird der Wert, den das Tag enthält in das neu zu erstellende xml Dokument geschrieben.
Mit Hilfe des Sylesheets wird also Dein Ausgangsdokument entsprechend Deiner Vorgaben umgewandelt.
Am besten Du ziehst Dir mal XMLSpy von http://www.xmlspy.com/. Dann kopierst Du den Code vom XML Dokument ( siehe oben ) und erstellst Dir ein neues XML Dok. auf der Platte. Das gleiche machst Du mit dem StyleSheet aus der Datenbank (Endung muss .xsl lauten). Öffne das erstellte XML Doc in XMLSpy. Im Menüpunkt View stelle auf TextView um un Drück F11, so kommst Du in den DebugModus. Lade jetzt Dein Stylesheet. Mit F11 kannst Du jetzt Schritt für Schritt durch den Code gehen. Im rechten Fenster (Output) wird Dein Ergebnis zusammengebaut.
--- Zitat ---Wie erstelle ich denn nun die XSL Datei,
--- Ende Zitat ---
Erstellen kannst Du sie mit xmlSpy.
--- Zitat ---woher weiss Lotus, welches Feld zu welchem tag gehört ?
--- Ende Zitat ---
das weiss Lotus nicht, das wird durch den StyleSheet erledigt.
Gruss Hevelmann
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln