Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: nikon am 10.02.06 - 15:38:01
-
Hallo zusammen!
Ich versuche mich schon ein paar Tage immer mal wieder so neben dem Tagesgeschäft in XML einzuarbeiten. Einige Fortschritte habe ich auch schon gemacht...
Auf unserem Domino-Server hier, habe ich mit Hilfe einer eingebetteten Ansicht einen XML-Feed erstellt. Ich habe auch eine passende XSLT und DTD erstellt. Das klappt auch alles wunderbar und war auch kein großartiges Thema sag ich mal.
Probleme habe ich jetzt allerdings damit, den Stream zu verarbeiten!! Ich muss mit einem Client hergehen können und die Informationen des Streams von außerhalb verarbeiten können. Sagen wirs mal so: wenn ich irgendwie eine XML-Datei erhalten könnte, wäre die restliche Verarbeitung mit Sicherheit kein großartiges Problem... bißchen Hilfe wälzen, bißchen googlen, vielleicht das <ironie>herrliche</ironie> ibm redbook dazu, oder wie auch immer. Mein Frage ist im Moment allerdings einfach nur, wie ich die XML-Daten abgreifen kann? Ich habe mir einmal SOAP angeschaut und bin mir aber gar nicht sicher, ob das das richtige für mich ist. Vielleicht kann mir einer einen Tip geben, wie ich diese Daten einlesen kann? Das wäre sehr nett!
Achja - wenn das möglich ist mit Lotus Script. /me kann leider kein Java. :'(
Domino-(Web)Server 6.0.4 und Client 6.5.5
Vielen Dank im vorraus!
Gruß Dirk
-
Du willst von deiner Eingebetteten Ansicht das XML erhalten? Im Notes?
Denke da wirst Du nicht allzuweit kommen.
Da kommst DU eigentlich nur übers Web ran, aber das ist ein anderes Thema.
Um an Raw XML Daten in Lotusscript zu gelangen kannst Du entweder die eingebauten DXL Exporter verwenden oder einen Agent, welcher dir den passenden XML Stream liefert.
Was willst Du erreichen? MiMo ! (More in More out :-))
-
MiMo? ;D
Tschuldige... da hab ich mich wahrscheinlich ein bißchen verhaspelt beim erklären: Also ich muss die Daten übers Web einlesen!! Ich habe hier nur die Datenbank erstellt, die mit der eingebetteten Ansicht die Daten bereitstellt. Der Notes-Client wird ein entfernter Client sein und eine Verbindung nur übers Web aufbauen.
Einen NotesStream zu verwenden habe ich schon probiert. Habe versucht mit NotesStream.Open("http-adresse") den Stream zu öffnen und so zu verarbeiten. Das hat leider nicht funktioniert. In der Hilfe/bei meiner Recherche habe ich auch immer nur davon gelesen, ein XML-FILE einzulesen. Von einem Stream "onthefly" war nie die Rede. Deshalb dachte ich/befürchtete ich andere Wege wie z.B. SOAP nehmen zu müssen.
Erreichen möchte ich, dass entfernte Notes-Clients, die Daten die ich hier auf unserem Webserver bereitstelle, einlesen können und ich entsprechende weitere Aktionen mit Script vollführen kann.
(ohne dass diese Clients querzugelassen sind und eine Notes-Verbindung aufbauen o.Ä.)
Gruß DIrk
-
Vielleicht hab ich Dich auch noch immer nicht verstanden, aber Du möchtest eine Datei einlesen und daraus dann Notesdokumente machen?
Diesen Agenten hab ich mal gebastelt und er funktioniert eigentlich auch. Es wird eine .xml-Datei eingelesen und daraus Dokumente und Antwortdokumente generiert:
Declarations:
Dim domParser As NotesDOMParser
Initialize:
Sub Initialize
Dim session As NotesSession
Dim Workspace As New NotesUIWorkspace
Dim db As NotesDatabase
Dim inputStream As NotesStream
Dim docNode As NotesDOMDocumentNode
Dim a As notesDOMNode
Dim node As NotesDOMNode
Dim automatname As String
Dim checkview As notesview
Dim checkdoc As NotesDocument
Dim nextcheckdoc As NotesDocument
Dim checkcoll As NotesDocumentcollection
'#############################################################################
Dim origXML As String
' Variable für die XML-Datei
Dim xmlFilename As Variant
xmlFilename = Workspace.OpenFileDialog( False , "Aus welcher XML-Datei soll importiert werden?"_
,"XML-Files|*.xml", "W:\test\termi.xml" , "*.xml" )'"W:\test\termi.xml" '"W:\test\golem\xml\termi.xml"
If Isempty(xmlFilename) Then
Exit Sub
End If
origXML = xmlFilename(0)
'#############################################################################
Set session = New NotesSession
Set db = session.CurrentDatabase
'########################################
Set checkview = db.GetView("automatname")
'########################################
'open the XML file
Set inputStream = session.CreateStream
inputStream.Open (origXML)
'create DOM parser and process
Set domParser=session.CreateDOMParser(inputStream)
domParser.Process
'get the document node
Set docNode = domParser.Document
'############
Dim child As NotesDOMNode
'Dim eNode As NotesDOMElementNode
Dim numChildNodes As Integer
Dim firstdoc As NotesDocument
Dim childdoc As NotesDocument
Set node = docnode
If Not node.IsNull Then
Set child = node.LastChild ' Get the last node
Dim numAttributes As Integer, numChildren As Integer
numAttributes = child.attributes.numberofentries
Set node = child
Stop
Set firstdoc = db.CreateDocument()
firstdoc.Form = Node.NodeName
Dim i As Integer
Dim feldname As String
Dim feldwert As String
Dim item As NotesItem
Dim attrs As notesdomnamednodemap
Set attrs = Node.Attributes ' Get attributes
For i = 1 To numAttributes ' Loop through them
Set a = attrs.GetItem(i)
feldname = a.NodeName
If feldname = "xmlns:xsi" Then
Goto weiter
End If
If feldname = "xsi:noNamespaceSchemaLocation" Then
feldname = "schema"
End If
feldwert = a.NodeValue
Set item = firstdoc.ReplaceItemValue( "att_"+feldname, feldwert )
weiter:
Next
'#############################################################################################
Set checkdoc = checkview.GetDocumentByKey(firstdoc.att_name(0)) ' Prüfen ob es diesen
'Automaten schon gibt
Dim meldung As Integer
If Not checkdoc Is Nothing Then
meldung = Messagebox ("Dieser GeVo ist schon modelliert!"_
+Chr(10)+"Wollen Sie diesen ersetzen?", 3 + 32 , "GeVo ersetzen?")
If meldung = 2 Or meldung = 7 Then ' bei "Abbruch" oder "Nein"
Exit Sub
Else ' bei "OK" zum Überschreiben der alten Datensätze
Set checkcoll = checkview.GetAllDocumentsByKey(checkdoc.att_name(0))
Set checkdoc = checkcoll.GetFirstDocument
Do
Set nextcheckdoc = checkcoll.GetNextDocument(checkdoc)
Call checkdoc.Remove(True)' Löschen der alten Datensätze
Set checkdoc = nextcheckdoc
Loop Until checkdoc Is Nothing
End If
End If
'#############################################################################################
Call firstdoc.ComputeWithForm(True, True)
automatname = firstdoc.key_za(0)
Call firstdoc.Save( True, True )
End If
Set child = node
Call walkNameValue(child, firstdoc,automatname) ' kind übergeben und alle anderen kinder in der
' sub abarbeiten
End Sub
Sub "walkNameValue":
Sub walkNameValue ( node As NotesDOMNode, firstdoc As NotesDocument, automatname As String)
' hier werden alle doks zu nodes angelegt, die direkt unter
' dem zustandsautomaten stehen
Dim child As NotesDOMNode
Dim nextchild As NotesDOMNode
Dim numChildNodes As Integer
Dim childnumChildNodes As Integer
Dim session As NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim childdoc As NotesDocument
Dim numAttributes As Integer, numChildren As Integer
Dim a As notesDOMNode
Set session = New NotesSession
Set db = session.CurrentDatabase
If Not node.IsNull Then
Set child = node.FirstChild ' Get the first node
numChildNodes = node.NumberOfChildNodes
Do
Select Case child.NodeType
Case DOMNODETYPE_ELEMENT_NODE:
numAttributes = child.attributes.numberofentries
Set doc = db.CreateDocument()
doc.Form = child.NodeName
Dim i As Integer
Dim feldname As String
Dim feldwert As String
Dim item As NotesItem
Dim attrs As notesdomnamednodemap
Set attrs = child.Attributes ' Get attributes
For i = 1 To numAttributes ' Loop through them
Set a = attrs.GetItem(i)
feldname = a.NodeName
If feldname = "xmlns:xsi" Then
Goto weiter
End If
If feldname = "xsi:noNamespaceSchemaLocation" Then
feldname = "schema"
End If
feldwert = a.NodeValue
Set item = doc.ReplaceItemValue( "att_"+feldname, feldwert )
weiter:
Next
Call doc.MakeResponse(firstdoc)
doc.key_za = automatname
Call doc.Save( True, True )
End Select
childnumChildNodes = child.NumberOfChildNodes ' hat das node noch kinder
If childnumChildNodes >0 Then
Set nextchild = child.FirstChild
Do
Call walkNameValuechild(nextchild, doc, automatname) ' kind übergeben und alle anderen kinder in der
' sub abarbeiten
Set nextchild = nextchild.NextSibling
childnumChildNodes = childnumChildNodes-1
Loop Until childnumChildNodes = 0
End If
Set child = child.NextSibling
numChildNodes = numChildNodes-1
Loop Until numChildNodes = 0
Stop
End If
End Sub
Sub "walkNameValuechild":
Sub walkNameValuechild ( node As NotesDOMNode, doc As notesdocument, automatname As String)
Dim child As NotesDOMNode
Dim nextchild As NotesDOMNode
Dim numChildNodes As Integer
Dim childnumChildNodes As Integer
Dim session As NotesSession
Dim db As NotesDatabase
Dim childdoc As NotesDocument
Dim a As notesDOMNode
Set session = New NotesSession
Set db = session.CurrentDatabase
Select Case node.NodeType
Case DOMNODETYPE_ELEMENT_NODE: ' Most nodes are Elements
Stop
Dim numAttributes As Integer, numChildren As Integer
numAttributes = node.attributes.numberofentries
'##########################################################################
Set childdoc = db.CreateDocument()
childdoc.Form = node.NodeName
Dim i As Integer
Dim feldname As String
Dim feldwert As String
Dim item As NotesItem
Dim attrs As notesdomnamednodemap
Set attrs = node.Attributes ' Get attributes
For i = 1 To numAttributes ' Loop through them
Set a = attrs.GetItem(i)
feldname = a.NodeName
If feldname = "xmlns:xsi" Then
Goto weiter
End If
If feldname = "xsi:noNamespaceSchemaLocation" Then
feldname = "schema"
End If
feldwert = a.NodeValue
Set item = childdoc.ReplaceItemValue( "att_"+feldname, feldwert )
weiter:
Next
Call childdoc.MakeResponse(doc)
childdoc.key_za = automatname
Call childdoc.Save( True, True )
Do
childnumChildNodes = node.NumberOfChildNodes ' hat das node noch kinder
If childnumChildNodes >0 Then
Set nextchild = node.FirstChild
Do
Call walkNameValuechild(nextchild, childdoc, automatname) ' kind übergeben und alle anderen kinder in der
' sub abarbeiten
Set nextchild = nextchild.NextSibling
childnumChildNodes = childnumChildNodes-1
Loop Until childnumChildNodes = 0
If childnumChildNodes > 0 Then
Set child = child.NextSibling
numChildNodes = numChildNodes-1
End If
End If
Loop Until numChildNodes = 0
Exit Sub
End Select 'node.NodeType
End Sub
-
Imho besitzt LotusScript selbst keine Möglichkeiten, um Dateien aus dem Web auszulesen.
Mit Java geht das für meinen Geschmack prima mit HttpClient von apache.jakarta.commons.
Andere Leute haben hier aber auch WinApi Funktionen dafür benutzt.
Gruß Axel
[offtopic]
Einer meiner Aufgaben ist z.Zt. z.B. das xml der täglichen Referenz-Wechselkurse der Europ. Zentralbank in eine MySQL5 Tabelle zu schreiben. Mir sind die xml Fähigkeiten von MySQL5 noch nicht so ganz klar. Kann aber sein, dass ich dafür nicht mehr als 25 Zeilen code brauche.
Wenn es darüber nicht geht werden es höchstens 50 Zeilen.
[/offtopic]
-
@botschi: Nein nicht ganz. Ich meinte, dass die Erstellung der Notes Dokumente im Anschluss noch erfolgen muss, aber dass das wohl kein Thema werden wird, wenn ich mich ein bißchen durch die Hilfe wühle. Aber vielen Dank an dieser Stelle schon einmal für den Code! :D
@kennwort: Genau darum ging es mir. Und ich habe befürchtet, dass das die Antwort sein wird. Ich beherrsche Java wie gesagt leider nicht - was zwar in Anbetracht der Entwicklung von Notes eine klare Lücke ist, aber momentan kann ich wohl leider noch nichts daran ändern. :(
Inwiefern kann ich denn da die WinAPI für mich einsetzen? Oder könnte ich relativ einfach den besagten Java-Agenten schreiben, der mir für die weitere Verarbeitung, eine XML-Datei auf die Platte schreibt? Damit käme ich ja dann wahrscheinlich auch klar. ;)
Gruß Dirk
-
Manfred Dillmann und Mark (mt69clp) haben das glaub ich gemacht. Mark hat das - wenn mich nicht alles täuscht nicht vor allzulanger Zeit gepostet. Guck einfach seine Postings durch. Vor ca. 2 Wochen. Ich hoffe, ich hab jetzt keinen Quatsch erzählt. Nein. hab ich nicht, denke ich.
Java lernen ist mehr eine längerfristige Angelegenheit. Deshalb hast du Recht.
Gruß Axel
-
Entschuldige meine späte Antwort, aber die Grippewelle hatte mich erwischt. >:(
Ich werde gleich mal schauen, ob was entsprechendes bei den Postings von Mark für mich dabei war. Hat Manfred Dillmann nicht auch einen RSS-Reader auf Notesbasis geschrieben? Ich entsinne mich dunkel. ;) Naja... das wäre ja genau das was ich brauche für mein Problem.
Danke schonmal für die Info!
Gruß Dirk