Domino 9 und frühere Versionen > ND6: Entwicklung
RichText in RichText EINFÜGEN
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