Autor Thema: [erledigt] XML Datei in die NSF importieren  (Gelesen 9366 mal)

Offline Ozan

  • Senior Mitglied
  • ****
  • Beiträge: 277
[erledigt] XML Datei in die NSF importieren
« am: 29.05.09 - 10:06:28 »
Hallo,

habe eine XML Datei den ich gerne in die *.nsf importieren möchte. Und zar will ich dass  der Baumstruktur wie bei einem XML-Editor, auch in die *.nsf übernommen wird.

Aus der suche heraus habe ich folgendes gefunden:

Sub Initialize
  Dim session As New NotesSession
  Dim db As NotesDatabase
  Set db = session.CurrentDatabase
  filename$ = Left(db.FileName, Len(db.FileName) - 4)
  
  REM Open xml file named after current database
  Dim stream As NotesStream
  Set stream = session.CreateStream
  If Not stream.Open("c:\dxl\" & filename$ & ".dxl") Then
    Messagebox "Cannot open " & filename$,, "Error"
    Exit Sub
  End If
  If stream.Bytes = 0 Then
    Messagebox "File did not exist or was empty",, filename$
    Exit Sub
  End If
  
  REM Replace documents in this database with matching ones in the DXL
  Dim importer As NotesDXLImporter
  Set importer = session.CreateDXLImporter(stream, dbCopy)
  importer.DocumentImportOption = DXLIMPORTOPTION_REPLACE_ELSE_IGNORE
  Call importer.Process
End Sub

Das problem ist nur dass der mit einer Fehlermeldung aussteigt:

"DXLImporter output object is invalid, uninitialized, or not explicitly declared and strongly typed"

Ist das vielleicht der falsche Weg eine XML Datei zu importieren?

Gruss

Ozan
« Letzte Änderung: 03.06.09 - 16:16:25 von Ozan »

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: XML Datei in die NSF importieren
« Antwort #1 am: 29.05.09 - 11:32:12 »
Wo wird dbCopy deklariert und instantiiert?

Bernhard

Offline Ozan

  • Senior Mitglied
  • ****
  • Beiträge: 277
Re: XML Datei in die NSF importieren
« Antwort #2 am: 29.05.09 - 11:50:26 »
Stimmt, das fehlt. Ich habe aus der suche leider nicht alles mitgenommen gehabt.  :-\
Habe jetzt aus der Designerhilfe das gefunden und eingefügt:

  REM Create new database named after current database
  Dim dbCopy As NotesDatabase
  Set dbCopy = New NotesDatabase("", "")
  Call dbCopy.Create("", filename$ & "Copy", True)  'Sollte ich glaube rausnehmen da der eine neue DB erstellt

Fehler: DXL importer operation failed

Und wenn ich die Zeile Call dbCopy.Create rausnehme dann wieder gleiche Fehlermeldung:

"DXLImporter output object is invalid, uninitialized, or not explicitly declared and strongly typed"
« Letzte Änderung: 29.05.09 - 11:54:31 von Ozan »

Offline Fedaykin

  • Aktives Mitglied
  • ***
  • Beiträge: 229
  • Geschlecht: Männlich
  • Ya Hya Chouhada!
Re: XML Datei in die NSF importieren
« Antwort #3 am: 29.05.09 - 12:04:36 »
Hallo Ozan

Ohne mich mal genauer mit dem Code zu befassen folgende Frage:
Ist das denn ein DXL, sprich Domino XML (Export eines Gestaltungselementes in DXL) oder ein anderes "ganz normales" XML, das Du importieren willst?

Gruss
Remo
Ich sage Euch: "Man muss noch Chaos in sich haben, um einen tanzenden Stern gebären zu können."

Offline Ozan

  • Senior Mitglied
  • ****
  • Beiträge: 277
Re: XML Datei in die NSF importieren
« Antwort #4 am: 29.05.09 - 12:19:38 »
Hallo Remo,

es ist eine Normale XML File die so aussieht:

 <?xml version="1.0" encoding="UTF-8" ?>
- <obexim>
- <node id="3" branches="24" title="Technisches">
- <node id="23" branches="24" title="Mac">
- <node id="124" branches="24" title="Anschluss">
- <text id="848" title="IRQ" branches="24">
- <![CDATA[
<UL>
<LI>
.....
  ]]>
  </text>
- <text id="1167" title="SYSTEM" branches="24">
...
« Letzte Änderung: 29.05.09 - 12:39:25 von Ozan »

Offline Fedaykin

  • Aktives Mitglied
  • ***
  • Beiträge: 229
  • Geschlecht: Männlich
  • Ya Hya Chouhada!
Re: XML Datei in die NSF importieren
« Antwort #5 am: 29.05.09 - 12:49:16 »
Hallo Ozan

Damit kann Notes so nichts anfangen. Es kann ja nicht wissen was und wie Du was aufbauen willst. Da kommst Du nicht drum herum das XML zu parsen und dann das zu machen was Du willst.

Die Beispiele in der Hilfe zu den Klassen
NotesDOMParser oder NotesSAXParser
könnten dabei hilfreich sein.

Mir ist NotesDOMParser sympatischer, ist aber vielleicht auch etwas Geschmackssache.

Gruss
Remo
Ich sage Euch: "Man muss noch Chaos in sich haben, um einen tanzenden Stern gebären zu können."

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: XML Datei in die NSF importieren
« Antwort #6 am: 29.05.09 - 12:51:14 »
Das geht so nicht.

Mit dem DXLimporter kannst du nur Domino-XML (DXL) konforme Dokumente importieren.

Du könntest jetzt mittels XSLT-Transformation dein XML in DXL transformieren (schwierig) oder mittels DOM/SaxParser dein XML parsen und dann auf herkömmliche Art Dokumente anlegen und die Felder entsprechend befüllen. (einfacher)

Gruß
Roland

edit: zu langsam :)
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline Ozan

  • Senior Mitglied
  • ****
  • Beiträge: 277
Re: XML Datei in die NSF importieren
« Antwort #7 am: 29.05.09 - 14:14:01 »
Verstehe, ich habe das entsprechen gesucht und gefunden, habe das so:

(Declarations)
Dim domParser As NotesDOMParser
Dim LF As String
Sub Initialize
  Dim session As NotesSession
  Dim db As NotesDatabase
  Dim inputStream As NotesStream, outputStream As NotesStream
  Dim docNode As NotesDOMDocumentNode
 
  Dim origXML As String, outputFile As String
  origXML = "c:\dxl\xmldom.xml"
  outputFile = "c:\dxl\DOMtree.txt"
 
  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 ( 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)
     
    Case DOMNODETYPE_ELEMENT_NODE:        ' Most nodes are Elements
      domParser.Output("Element node: "+node.NodeName )
      Set elt = node
     
      Dim numAttributes As Integer, numChildren As Integer
      numAttributes = elt.attributes.numberofentries
      domParser.Output(" has "+Cstr(numAttributes)+" Attributes"+LF)
     
      Set attrs = elt.Attributes     ' Get attributes
     
      Dim i As Integer
      For i = 1 To numAttributes     ' Loop through them
        Set a = attrs.GetItem(i)
        ' Print attr. name & value
        domParser.Output("Attribute "+a.NodeName+": "+a.NodeValue+LF)
      Next
     
      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


eingesetzt, lief auch fehlerfrei. Jetzt hat der mir eine Datei erzeugt: DOMtree.txt
Jetzt müsste ich die gefilterte Infos daraus nehmen und in die DB schreiben? Oder kann man das so einstellen dass der gleich in der DB die Documente anlegt?

Gruss

Ozan

Offline Fedaykin

  • Aktives Mitglied
  • ***
  • Beiträge: 229
  • Geschlecht: Männlich
  • Ya Hya Chouhada!
Re: XML Datei in die NSF importieren
« Antwort #8 am: 29.05.09 - 16:36:23 »
Hallo Ozan

Das kann man nun so programmieren, dass er die Dokumente direkt erzeugt.

Gruss
Remo
Ich sage Euch: "Man muss noch Chaos in sich haben, um einen tanzenden Stern gebären zu können."

Offline Ozan

  • Senior Mitglied
  • ****
  • Beiträge: 277
Re: XML Datei in die NSF importieren
« Antwort #9 am: 29.05.09 - 17:08:03 »
Hallo Remo,

diese Baumstruktur macht mir viel Bauch schmerzen, kannst du mir das beispielweise zeigen wie das funktioniert?

hier ein teil der OutputXML:


DOM Parser Report - Walk Tree agent
Document node: #document has 2 Child Nodes
Element node: obexim has 0 Attributes
Text node:

Element node: node has 3 Attributes
Attribute id: 3
Attribute title: Technisches
Attribute branches: 24
Text node:

Element node: node has 3 Attributes
Attribute id: 23
Attribute title: Mac
Attribute branches: 24
Text node:

Element node: node has 3 Attributes
Attribute id: 124
Attribute title: Anschluss
Attribute branches: 24
Text node:

Element node: text has 3 Attributes
Attribute id: 848
Attribute title: IRQ
Attribute branches: 24
CDATA Section node: #cdata-section has value of <UL>
<LI>......
</P></A>



***
Bis hier hin währe z.b eine Seite bzw. eine Document weil ich die Baumstruktur auch behalten will
***



text
Text node:

Element node: text has 3 Attributes
Attribute id: 1167
Attribute title: Teil2
Attribute branches: 24
CDATA Section node: #cdata-section has value of <P><A
text
Text node:

Element node: text has 3 Attributes
Attribute id: 1564
Attribute title: Teil3
.....

Eine Ansicht wie in der XML-Editor( + und - ) währe auch machbar? Also im Notes dann mit Katalogiesierung.

Gruss

Ozan

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: XML Datei in die NSF importieren
« Antwort #10 am: 30.05.09 - 03:41:02 »
Sax Parser wäre hier schon objektiv die bessere Lösung, u.a. da er weniger Ressourcen verbraucht. Und wirklich u.a.
Aber da du schon mal so angefangen hast....
Es geht viel übersichtlicher.
Die uncoolere Lösung ist mit globalen Variablen zu arbeiten.
Ein bischen besser wäre
Ich präferiere auf Notes z.Zt. JDom mit XPath, aber das ist wohl völlig off.

Code
case DOMNODETYPE_ELEMENT_NODE:    
Du kannst jetzt hier machen:
Code
if nodename = "ul" then // für nodename s. api dokumentation
set doc = db.CreateDocument ' doc muss global sein!!!
doc.form = "urForm"
else if nodename = "node" then 
schreib attribute x in notesItem y. 
end if

Ist vielleicht nicht kristalklar. Ist aber schon spät.
Frag einfach nochmal nach.

Ein bischen besser wäre, wenn du der rekursiv aufgerufenen walkTree Methode als zweiten Parameter ein NotesDocument Objekt mitgeben würdest. 
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 thomasP

  • Frischling
  • *
  • Beiträge: 9
  • Geschlecht: Männlich
Re: XML Datei in die NSF importieren
« Antwort #11 am: 31.05.09 - 21:11:18 »
Du kannst mal versuchen den Microsoft-XML-Parser zu benutzen.
Ich habe hier eine Lotus-Script-Klasse angehängt, mit der man XML-Dateien lesen kann und
selectiv auf bst. Konten ztugreifen kann ( XPATH).
Die Klasse ist auf bst.Problem zugeschnitten und umkommentiert, zeigt aber das Prinzip.

Es es möglich in Lotus-Script (fast alle) - Methoden zu benutzen.
Um die Beschäftigung mit dem Object-Modell und den verschiedenen Versionen des MS-XML-Parsers kommst Du aber nicht drum rum.
Ich selber benutzte diesen Parser in verscheidenen Notes-DBs um komplexes Inhalte zu manipulieren und u.a mit XSLT große Reports zu generieren (XML->HTML bzw. XML->PDF via FOP /Java).


http://msdn.microsoft.com/en-us/library/ms757828(VS.85).aspx

Offline m3

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.102
  • Geschlecht: Männlich
  • Non ex transverso sed deorsum!
    • leyrers online pamphlet
Re: XML Datei in die NSF importieren
« Antwort #12 am: 31.05.09 - 21:37:41 »
Es es möglich in Lotus-Script (fast alle) - Methoden zu benutzen.
... solange der Client unter Windows läuft ...
HTH
m³ aka. Martin -- leyrers online pamphlet | LEYON - All things Lotus (IBM Collaborations Solutions)

All programs evolve until they can send email.
Except Microsoft Exchange.
    - Memorable Quotes from Alt.Sysadmin.Recovery

"Lotus Notes ist wie ein Badezimmer, geht ohne Kacheln, aber nicht so gut." -- Peter Klett

"If there isn't at least a handful of solutions for any given problem, it isn't IBM"™ - @notessensai

Offline Ozan

  • Senior Mitglied
  • ****
  • Beiträge: 277
Re: XML Datei in die NSF importieren
« Antwort #13 am: 02.06.09 - 10:27:51 »
Hallo,

hier ist die Test-Datei(Anhang) nach der Verarbeitung, vielleicht könnt Ihr dann besseres Bild machen.

//Declaration
Public doc As NotesDocument
//Declaration


if nodename = "ul" then
 set doc = db.CreateDocument
 doc.form = "urForm"
else
 if nodename = "node" then
'  schreib attribute x in notesItem y.
 end if
end if

Sagt fehler "Object variable not set"
« Letzte Änderung: 02.06.09 - 10:43:00 von Ozan »

Offline ascabg

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.697
  • Geschlecht: Männlich
Re: XML Datei in die NSF importieren
« Antwort #14 am: 02.06.09 - 10:32:36 »
Hallo,

Wird auch an irgendeiner Stelle die Variable db deklariert und instanziiert.
Set db = ...

Anderenfalls, an welcher Stelle genau sagt er denn "Object variable not set"
Andreas

Offline Ozan

  • Senior Mitglied
  • ****
  • Beiträge: 277
Re: XML Datei in die NSF importieren
« Antwort #15 am: 02.06.09 - 10:42:04 »
Case DOMNODETYPE_ELEMENT_NODE:        ' Most nodes are Elements
         
Dim doc As NotesDocument
Dim session As NotesSession
Dim db As NotesDatabase
Set session = New NotesSession   
Set db = session.CurrentDatabase

If nodename = "ul" Then
 Set doc = db.CreateDocument         ### hier schreibt der in die DOMTree.txt "Object variable not set"
 doc.form = "urForm"
Else
 If nodename = "node" Then
'  schreib attribute x in notesItem y.
 End If
End If

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: XML Datei in die NSF importieren
« Antwort #16 am: 02.06.09 - 11:42:07 »
if node.NodeName = "ul" then
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 Ozan

  • Senior Mitglied
  • ****
  • Beiträge: 277
Re: XML Datei in die NSF importieren
« Antwort #17 am: 03.06.09 - 08:35:53 »
Ne leider auch nicht, ich werde jetzt versuchen diese Text Datei in die NotesDatenbank einzulesen, ich melde mich dannach.

Gruss

Ozan

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: XML Datei in die NSF importieren
« Antwort #18 am: 03.06.09 - 09:19:00 »
Was meinst du mit "geht leider auch nicht".
Schalte bitte den debugger ein und sag mir, in welcher Zeile welche Objekt-Variable nicht gesetzt ist.
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 Datei in die NSF importieren
« Antwort #19 am: 03.06.09 - 10:43:06 »
Du deklarierst db im initialize. Dann ist die Variable natürlich in walkTree nicht mehr im scope.
Hättest du Options Declare einschalten, würde der LotusScript Compiler den Fehler melden.
Mach db zu einer globalen Variable.
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

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz