Domino 9 und frühere Versionen > ND6: Entwicklung

RichText in RichText EINFÜGEN

<< < (2/14) > >>

eknori (retired):
Abschließend für heute bleibt noch, daß die DXLImport und DXLExport class mit richtig großen Datenmengen ( > 100 MB ) gut klarkommt. Das FindAndReplace steigt aber bei diesen Datenmengen mit einem RSOD aus ...  :P
Da ist schon bei einem kleinen Attachment ( 1MB ) im SourceDoc Schluß

eknori (retired):
Dieser Code funktioniert bei mir mit einem Dokument mit einem Anhang > 300 MB ohne RSOD; allerdings wird hier auch nichts ersetzt, sondern lediglich die Position des RichTextFeldes im XML gefunden. Immerhin aber schon mal ein Anfang  ;D


--- Zitat ---Sub Click(Source As Button)
   
   Dim rootElement As NotesDOMElementNode
   Dim docList As NotesDOMNodeList   
   Dim node As NotesDOMNode   
   Dim eNode As NotesDOMElementNode
   Dim i As Integer   
   
   Dim session As New NotesSession
   Dim db As NotesDatabase
   Set db = session.CurrentDatabase
   
   Dim dc As NotesDocumentCollection
   Set dc = db.UnprocessedDocuments
   If dc.Count = 0 Then
      Messagebox "No document selected",, "No document"
      Exit Sub
   End If
   Dim doc As NotesDocument
   Set doc = dc.GetFirstDocument
   
   Dim NewDoc As NotesDocument
   Dim rtitem As NotesRichTextItem
   Set InMemDoc = db.CreateDocument
   Set rtitem = InMemDoc.CreateRichTextItem( "DXL" )
   
   ' Export DXL int RichTextField
   Dim exporter As NotesDXLExporter
   Set exporter = session.CreateDXLExporter
   Call exporter.SetInput(doc)
   Call exporter.SetOutput(rtitem)
   Call exporter.Process
   
   Msgbox "ready"
   
   Dim domParser As NotesDOMParser
   Set domParser=session.CreateDOMParser ( rtItem )
   domParser.Process
   Set rootElement = domParser.Document.DocumentElement
   Set docList = rootElement.GetElementsByTagName ( "item" )
   
   If docList.NumberOfEntries = 0 Then
      Messagebox "No <item> element nodes in file", , "Error"
      Exit Sub
   End If
   
   For i = 1 To docList.NumberOfEntries
      Set node = docList.GetItem( i )
      Set enode = node
      If enode.GetAttribute("name") = "RTONE" Then
         Msgbox "found at position " & Cstr(i)
      End If
   Next
   
%REM   
   ' Modify Body with FindAndReplace
   ' #RT:RTTWO
   Dim rtnav As NotesRichTextNavigator
   Dim rtrange As NotesRichTextRange
   Dim ret As Long
   Set rtnav = rtItem.CreateNavigator
   Set rtrange = rtItem.CreateRange
   
   ret =  rtrange.FindAndReplace _
   ( "#RT:RTTWO",_ ' find
   REPLACE_WITH, _ ' replaceWith
   RT_REPL_ALL + RT_FIND_CASEINSENSITIVE)
   
   Call rtItem.Update ' Must update before looping
   
%END REM   
   Dim importer As NotesDXLImporter
   Set importer = session.CreateDXLImporter(rtItem, db)
   importer.DocumentImportOption = DXLIMPORTOPTION_REPLACE_ELSE_IGNORE
   Call importer.Process
   'Call InMemDoc.remove(True)
   Msgbox "Import ready"   
End Sub

--- Ende Zitat ---

Wenn ich es mir so recht überlege, sind mit DXL auch so Sachen möglich, wie : " Wann wurde ein Dokument von wem gelesen?", ohne daß der Lesende Autorenrechte auf das Dokument hat, solange der Code per Agent über den Server ausgeführt wird.

<offtopic> Irgendwie scheint so kein anderer in das Thema mit einsteigen zu wollen, gell ? </offtopic>

koehlerbv:

--- Zitat von: eknori am 01.05.06 - 18:35:55 ---<offtopic> Irgendwie scheint so kein anderer in das Thema mit einsteigen zu wollen, gell ? </offtopic>
--- Ende Zitat ---

Oh doch, aber die Zeit dazu muss da sein: Mich interessiert das extrem, aber ich komme frühestens dazu, wenn ich wieder aus Italien zurück bin (> 20.05.2006).

Bernhard

flaite:
Ich schaus mir auf jeden Fall gleich mal an.
Soll ich vielleicht als frisch wieder-"erweckter" (haha) Linux User darüber weinen, dass Notes keinen vernünftigen Linux Client hat  ;D

flaite:
Erstmal zum navigieren:
Ich habs mit dem oberen Skript gemacht (griff auf ein File zu und erschien mir einfacher):


--- Code: ---Sub Initialize
Dim session As NotesSession
Dim db As NotesDatabase
Dim inputStream As NotesStream

Dim domParser As NotesDOMParser
Dim rootElement As NotesDOMElementNode
Dim docList As NotesDOMNodeList   
Dim node As NotesDOMNode   
Dim nodeChildOfRTOne As NotesDOMNode
Dim eNode As NotesDOMElementNode
Dim i As Integer   

Dim origXML As String
origXML = "c:\temp\RichText.xml"

Set session = New NotesSession   
Set db = session.CurrentDatabase

Set inputStream = session.CreateStream
inputStream.Open (origXML)

Set domParser=session.CreateDOMParser ( inputStream )
domParser.Process

Set rootElement = domParser.Document.DocumentElement
Set docList = rootElement.GetElementsByTagName ( "item" )

If docList.NumberOfEntries = 0 Then
Messagebox "No <item> element nodes in file", , "Error"
Exit Sub
End If

For i = 1 To docList.NumberOfEntries
Set node = docList.GetItem( i )
Set enode = node
If enode.GetAttribute("name") = "RTONE" Then
Msgbox "found at position " & Cstr(i)
Stop
rem hier kommen ein paar ergänzungen....
If enode.hasChildNodes Then

Set nodeChildOfRTOne = enode.FirstChild
While Not (nodeChildOfRTOne.isNull)
Msgbox nodeChildOfRTOne.NodeName & " vom Typ : " & Cstr(nodeChildOfRTOne.NodeType)

Set nodeChildOfRTOne = nodeChildOfRTOne.nextSibling
Wend


End If
End If
Next
End Sub

--- Ende Code ---

... und jetzt willst du da noch eine node anhängen? Versuch mal, ob ich aus dem bisherigen Text i.S. von ToDo schlau werde.

DOM hat als api in jeden Fall ein paar bekannte Überraschungen. Z.B. dass der Text-Nodes als Childnodes von enode rausgibt ist nicht direkt offensichtlich.
Beim Erzeugen und Einhängen von nodes gab es aber auch gotchas. Ich sollte die aber kennen.
In Java benutzt man heute übrigens eher neuere apis oberhalb von dom die einfacher in der Handhabung sind, wie z.B. dom4j.
Dom ist eine xml Api für allemöglichen Programmiersprachen. Durch diesen kleinste-gemeinsame-Nenner Ansatz wird die api selbst natürlich kompliziert.
Die Api ist entkoppelt von der Programmiersprache. Das hat eben auch Nachteile :-)

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln