Autor Thema: XML importieren in Notes  (Gelesen 2755 mal)

Offline robertpp

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 940
  • Geschlecht: Männlich
XML importieren in Notes
« am: 29.07.07 - 22:38:00 »
Hallo,

Kann mir vielleicht jemand helfen. Ich hab folgendes XML-File:

Code
<?xml version="1.0" encoding="utf-8"?>
<Report>
  <Data>
    <Row>
      <Ask_Price>Ask Price</Ask_Price>
      <Asset_Category>Asset Category</Asset_Category>
      <Asset_Category_Description>Asset Category Description</Asset_Category_Description>
      <Asset_ID>Asset ID</Asset_ID>
      <Asset_Status>Asset Status</Asset_Status>
      <Volume>Volume</Volume>
    </Row>
    <Row>
      <Ask_Price>97.6</Ask_Price>
      <Asset_Category>ORD</Asset_Category>
      <Asset_Category_Description>Ordinary</Asset_Category_Description>
      <Asset_ID>0x0003dd0014fae3d3</Asset_ID>
      <Asset_Status>ISS</Asset_Status>
      <Asset_Status_Description>Issued</Asset_Status_Description>
      <Volume>173,554</Volume>
    </Row>
  </Data>
</Report>

Es sieht jetzt ein wenig eigenartig aus aber ich würde dieses File gerne ins Notes importieren. Hab mir auch schon so manche Xml2Notes Datenbank heruntergeladen und angesehen. Nur sehen die xml-Files ganz anders aus als meines.
Für Tipps wäre ich sehr dankbar wo ich mir da vielleicht einen Code ansehen kann oder wie ich das importieren kann.

Danke Robert
------------------------------------------------------------
1250 Notes User Client von 5.0.5 bis 6.5.4     WIN2000, XP
14 Notes Server von 6.5 bis 6.5.4 WIN2000, XP

32   Notes Server von 5.0.1 bis 6.5.4 in unserer Domain
323 Notes Server weltweit mit 38000 User in einem Adressbuch

Offline robertpp

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 940
  • Geschlecht: Männlich
Re: XML importieren in Notes
« Antwort #1 am: 30.07.07 - 09:48:56 »
Hallo,

Ich hab gesehen, dass ich es in 7er Forum gepostet habe, sollte eigentlich in 6er.

Was ich noch dazu sagen wollte ist, ich weiß nicht warum einmal die Datenfelder als Row beschrieben sind und dann in einer eigenen Row dann die Werte dazu! Ist das beim importieren ein Problem?

Und das File sieht immer so aus, außer die Werte, die ändern sich.

danke Robert
------------------------------------------------------------
1250 Notes User Client von 5.0.5 bis 6.5.4     WIN2000, XP
14 Notes Server von 6.5 bis 6.5.4 WIN2000, XP

32   Notes Server von 5.0.1 bis 6.5.4 in unserer Domain
323 Notes Server weltweit mit 38000 User in einem Adressbuch

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: XML importieren in Notes
« Antwort #2 am: 30.07.07 - 10:26:10 »
XML ist eigentlich kein Format sondern ein Meta-Format. Theoretisch kannst du per XSLT die von dir gepostete xml Daten direkt in DXL-Dokument Instanzen konvertieren. Lass das aber.
Du kannst mit den in LotusScript vorhandenen XML Parsern (Dom und SAX) die Datei auslesen und aus den Daten kannst du dann "traditionell"  Notes Dokumente  erzeugen (NotesDatabase.createDocument().
Normalerweise  würde ich für diese Aufgabe SAX benutzen wg. Performance, in Java noch ganz andere Sachen. Für den Anfang ist es  aber  vielleicht besser den Dom Parser zu nehmen.
Such einfach in der Hilfe nach NotesDOMParser. Da ist ein Beispiel dabei. Kopiers dir, pass es dir an und schau dir an, was im Debugger passiert. 
Es ist nicht einfach zu erklären, wenn sich Leute noch nicht mit xml-Parsing beschäftigt haben. Einfach mal die Beispiele aus der Hilfe ausprobieren. Es ist dann in quasi jeder Programmiersprache oder Umgebung mit Ausnahme von JavaScript mehr oder weniger ähnlich (.NET, Java/J2EE, Domino, Ruby on Rails, etc.), wobei einige mittlerweile mehr sophisticated Arten von xml Parsing kennen. Dafür sollte man aber die Basics (DOM und SAX Parsing) sowieso verstanden haben.

Gruß Axel
« Letzte Änderung: 30.07.07 - 10:54:20 von Axel Janssen »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline robertpp

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 940
  • Geschlecht: Männlich
Re: XML importieren in Notes
« Antwort #3 am: 30.07.07 - 21:18:09 »
Hallo Axel,

Ich will das eh so einfach wie möglich machen! Ich hab mir das jetzt mal angesehen komm da aber garnicht weiter! Wäre für einen kleinen Tipp noch dankbar.

robert
------------------------------------------------------------
1250 Notes User Client von 5.0.5 bis 6.5.4     WIN2000, XP
14 Notes Server von 6.5 bis 6.5.4 WIN2000, XP

32   Notes Server von 5.0.1 bis 6.5.4 in unserer Domain
323 Notes Server weltweit mit 38000 User in einem Adressbuch

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: XML importieren in Notes
« Antwort #4 am: 30.07.07 - 23:00:29 »
Das ist einfach, wenn du das einmal gemacht hast.
Für nächtliche Coding-Aktionen hab ich momentan einfach zu viel Projekt.
Ich hab das jetzt nach 250 km autofahren, 0.6 Liter Pfundstädter und 11 Stunden Arbeit schnell mal ausprobiert. Geht.
Kanns leider nicht vom Lapptop auf diesen PC transportieren. Der hat kein Notes.

Die Klasse NotesDomParser in der Hilfe hat ein Beispiel.
Ich hab deine Datei abgetippt und den Code von der HIlfe in einen Notes-Agenten kopiert.
Das Parsen macht schon das Beispiel aus der Hilfe.
Da wird gleichzeitig eine Report-Datei erzeugt.
Anstatt eine Report-Datei zu erzeugen Notes-Dokumente zu erzeugen ist wirklich einfache Standard-LotusScript Programmierung. Poste das morgen mal.

Gruß Axel
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: XML importieren in Notes
« Antwort #5 am: 31.07.07 - 08:40:42 »
Hallo Robert,

hier ist der Agent:
Declarations:
Code
Dim domParser As NotesDOMParser
Dim LF As String
Dim db As  NotesDatabase
Dim unsavedDoc As Integer
Dim doc As NotesDocument
Dim strCurrentNodeName As String

Initialize:
Code
Sub Initialize
Dim session As NotesSession
Dim inputStream As NotesStream, outputStream As NotesStream
Dim docNode As NotesDOMDocumentNode
Dim origXML As String, outputFile As String
origXML = "c:\dxl\in.xml"
outputFile = "c:\dxl\DOMtree.txt"
unsavedDoc = False
Dim header As String
header = "Walk Tree agent"
LF = Chr(13)+Chr(10)
On Error Goto errh
Set session = New NotesSession   
Set db = session.CurrentDatabase
  'create the output file
Set outputStream =session.CreateStream
outputStream.Open (outputFile)
outputStream.Truncate
  'write report title
outputStream.WriteText ("DOM Parser Report - " )
outputStream.WriteText (header+LF)
  'open the XML file
Set inputStream = session.CreateStream
inputStream.Open (origXML)
If inputStream.Bytes = 0 Then
outputStream.WriteText (origXML+" is empty"+LF)
Goto results
End If
  'create DOM parser and process
Set domParser=session.CreateDOMParser(inputStream, outputStream)
domParser.Process
  'get the document node
Set docNode = domParser.Document
Call walkTree(docNode)
results:
Call outputStream.Close
Exit Sub
errh:
outputStream.WriteText ("errh: "+Cstr(Err)+":  "+Error+LF)
Resume results
End Sub

Sub walkTree:
Code
Sub walkTree ( node As notesdomnode)
Dim child As notesdomnode
Dim elt As notesdomnode
Dim attrs As notesdomnamednodemap
Dim a As notesdomattributenode
Dim piNode As Notesdomprocessinginstructionnode
LF = Chr(13)+Chr(10)
If Not node.IsNull Then 
Select Case node.NodeType
Case DOMNODETYPE_DOCUMENT_NODE:        ' If it is a Document node
domParser.Output( "Document node: "+node.Nodename )
Set child = node.FirstChild   ' Get the first node
Dim numChildNodes As Integer
numChildNodes = node.NumberOfChildNodes
domParser.Output(" has "+Cstr(numChildNodes)+" Child Nodes"+LF)
While numChildNodes > 0
Set child = child.NextSibling ' Get next node
numChildNodes = numChildNodes - 1
Call walkTree(child)
Wend
Case DOMNODETYPE_DOCUMENTTYPE_NODE:   ' It is a <!DOCTYPE> tag
domParser.Output("Document Type node: "+ node.NodeName+LF)
Case DOMNODETYPE_TEXT_NODE:           ' Plain text node
domParser.Output("Text node: "+node.NodeValue+LF)
Dim strNodeValue As String
strNodeValue = node.nodeValue
If unsavedDoc Then
Stop
If Trim(node.NodeValue) <> "" And Uni(node.NodeValue) <> 10 And Uni(node.NodeValue) <> 13 Then ' hack -> ignore whitespace
Print Uni(node.NodeValue)
Call doc.ReplaceItemValue(strCurrentNodeName, node.NodeValue)
End If
If strCurrentNodeName = "Volume" Then ' hack! der letzte Tag
doc.Save True, False
unsavedDoc = False
End If
End If
Case DOMNODETYPE_ELEMENT_NODE:        ' Most nodes are Elements
strCurrentNodeName = node.NodeName
'stop
domParser.Output("Element node: "+node.NodeName )
If (node.NodeName = "Row") Then
Stop
If unsavedDoc = False Then
'stop
Set doc= db.CreateDocument
doc.form = "row"
unsavedDoc = True
End If
Else
If unsavedDoc Then
strCurrentNodeName = node.NodeName
End If
End If
Set elt = node
numChildren =  elt.NumberOfChildNodes
Set child = elt.FirstChild     ' Get child
While numChildren > 0
Call walkTree(child)
Set child = child.NextSibling   ' Get next child
numChildren = numChildren - 1
Wend
domParser.Output( elt.nodeName+LF)
Case DOMNODETYPE_COMMENT_NODE:                ' Comments
domParser.Output("Comment node: "+node.NodeValue+LF)
Case DOMNODETYPE_PROCESSINGINSTRUCTION_NODE:  ' Handle PI nodes
Set piNode = node
domParser.Output("Processing Instruction node: " )
domParser.Output(" with Target  "+piNode.Target+_
" and Data "+piNode.Data+LF)
Case DOMNODETYPE_CDATASECTION_NODE:           ' CDATA sections
domParser.Output("CDATA Section node: "+node.NodeName)
domParser.Output(" has value of "+node.NodeValue+LF)
Case DOMNODETYPE_ENTITYREFERENCE_NODE:        ' Handle entities
domParser.Output("Entity Reference node: "+node.NodeName+LF)
Case Else:
domParser.Output("Ignoring node: "+Cstr(node.NodeType)+LF)
End Select  'node.NodeType
End If        'Not node.IsNull
End Sub

Die Datei (so aufgebaut wie von dir gepostet) wird von C:\dxl\in.xml gelesen. An diesen Ort und unter diesen Namen solltest du die zu parsende xml-Datei vor Start des Agenten speichern. Der Name ist wirklich irreführend, weil das mit dxl nix zu tun hat. Ausserdem generiert der Code noch eine Report-Datei. Nicht weil das irgendwie sinnvoll wäre. Ich hab ja den Anfang aus der Notes Hilfe und da war das dabei. Für den echten Agenten würd ichs auf jeden Fall aufbauen. Das ist hier nur so eine Art proof of concept.
Der Agent besitzt weitere Schwächen. Z.B. sollten die globalen Variablen Dim unsavedDoc As Integer, Dim doc As NotesDocument, Dim strCurrentNodeName As String nicht global sein.
Eigentlich benutzt werden nur
- Case DOMNODETYPE_TEXT_NODE:       
- Case DOMNODETYPE_ELEMENT_NODE: und
- Case DOMNODETYPE_DOCUMENT_NODE:  (als Einstiegspunkt)
Die restlichen Case in walkTree kannst du vermutlich einfach löschen (habs nicht ausprobiert).
Errorhandling fehlt. Ausserdem hängt der Agent von der Reihenfolge der Elemente ab. Er erwartet, das Volume als letztes Child Tag von Row vorkommt. Normalerweise nehm ich für so Auslese-Operationen einen Parser des Typs SAX. Ich halte das aber für Anfänger in XML APIs für ein bischen verwirrender.
Ansonsten ist das aber ein brauchbarer Ansatz. Einfach starten und schaun, welche Dokumente der Agent erzeugt. Form ist "row".
Wichtig fürs Verständnis ist, dass die Unterroutine walkTree() z.T. rekursiv, d.h. aus walkTree() selbst aufgerufen wird.
Probleme beim nachvollziehen kann auch die Datei in.xml machen. Sie sollte in UTF-8 enkodiert sein. In guten Text-Editoren wie z.B. Textpad kann man das encoding beim Speichern auswählen, d.h. ist z.B. in Textpad Bestandteil des Speichern/Speichern Unter Dialogs. 
Ansonsten wird in Notes-Blogger Kreisen immer so gerne der Wert von Standards evoziert. XML in Kombination mit Parsern des Typs DOM und SAX sind Standards zum parsen von hierarchisch strukturierten Dateien. Kann man dann auch nutzen.

Gruß Axel



« Letzte Änderung: 31.07.07 - 08:51:46 von Axel Janssen »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline robertpp

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 940
  • Geschlecht: Männlich
Re: XML importieren in Notes
« Antwort #6 am: 04.08.07 - 21:31:53 »
Hallo Axel,

Ich hab erst jetzt Zeit gefunden mir das anzusehen! Das hilft mir sehr weiter! Den Rest schaff ich dann schon!!

danke Robert
------------------------------------------------------------
1250 Notes User Client von 5.0.5 bis 6.5.4     WIN2000, XP
14 Notes Server von 6.5 bis 6.5.4 WIN2000, XP

32   Notes Server von 5.0.1 bis 6.5.4 in unserer Domain
323 Notes Server weltweit mit 38000 User in einem Adressbuch

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz