Autor Thema: XML importieren in Notes  (Gelesen 2669 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