Domino 9 und frühere Versionen > ND6: Entwicklung

XML mit Notes verarbeiten

(1/2) > >>

nikon:
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

umi:
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 :-))

nikon:
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

botschi:
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

flaite:
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]

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln