Domino 9 und frühere Versionen > ND6: Entwicklung

RichText in RichText EINFÜGEN

(1/14) > >>

eknori (retired):
Das Thema ist zu interessant, als daß es in einem anderen Thread untergehen sollte. Der Einstiegspunkt im Thema ist folgendes Posting http://atnotes.de/index.php?topic=30182.msg190470#msg190470
Die weitere Diskussion zur DXL Lösung findet ab jetzt hier statt ...

eknori (retired):
So wie ich es nach dem Lesen der Designer Help zu DXLImport und DXLExport verstanden habe, lassen sich alle für ein InsertRTItem erforderlichen Operationen ohne IO Zugriffe auf die Festplatte, ausschließlich im Arbeitsspeicher ausführen.

Mit dem Ansatz, den ich hier beschreibe, ist es grundsätzlich auch möglich , den Insert an jede beliebige Stelle in eine RTItem zu machen. Letztendlich werden alle ( Insert ) Operationen an einer "Textdatei" durchgeführt. Und da muss man nur wissen, an welcher Stelle man einen weiteren String einfügen muss ...

Die Besonderheiten bei Attachments etc. lasen sich leicht mittels der Datenbank im Ursprungsthread herausfinden.
Einfach ein neues Sample erstellen, die gewünschten Elemente in das RT einfügen und einen DXLExport machen.

Den bisher verwendeten Code habe ich ausschließlich aus der Designer Hilfe zusammenkopiert ...


flaite:
Es gibt 2 verschiedene Wege, die es vermutlich einfacher machen als über Text zu gehen:
1. xslt
2. xml-Dom (gibts eine LotusScript Api für)

eknori (retired):
Irgendwie stehe ich mit XML und dem DOMParser auf Kriegsfusß.

Ich habe folgenden XML Export meines Dokuments

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE document SYSTEM 'xmlschemas/domino_7_0.dtd'>
<document xmlns='http://www.lotus.com/dxl' version='7.0' replicaid='C125715F002D73D1'
 form='Sample'>
<noteinfo noteid='916' unid='7EE586C3D6B725CCC1257160004210E3' sequence='26'>
<created><datetime dst='true'>20060430T140136,99+02</datetime></created>
<modified><datetime dst='true'>20060501T143234,46+02</datetime></modified>
<revised><datetime dst='true'>20060501T143234,45+02</datetime></revised>
<lastaccessed><datetime dst='true'>20060501T143234,45+02</datetime></lastaccessed>
<addedtofile><datetime dst='true'>20060430T140144,62+02</datetime></addedtofile></noteinfo>
<updatedby><name>CN=Heinz Ulrich Krause/O=Witte/C=de</name></updatedby>
<revisions><datetime dst='true'>20060430T140144,62+02</datetime><datetime
 dst='true'>20060430T140243,32+02</datetime><datetime dst='true'>20060430T140318,98+02</datetime><datetime
 dst='true'>20060430T140350,65+02</datetime><datetime dst='true'>20060430T140423,73+02</datetime><datetime
 dst='true'>20060430T144720,51+02</datetime><datetime dst='true'>20060430T153953,81+02</datetime><datetime
 dst='true'>20060430T154101,45+02</datetime><datetime dst='true'>20060430T154103,21+02</datetime><datetime
 dst='true'>20060430T154143,04+02</datetime><datetime dst='true'>20060430T154235,77+02</datetime><datetime
 dst='true'>20060430T154437,24+02</datetime><datetime dst='true'>20060430T154904,73+02</datetime><datetime
 dst='true'>20060430T155631,37+02</datetime><datetime dst='true'>20060430T160359,38+02</datetime><datetime
 dst='true'>20060430T162002,11+02</datetime><datetime dst='true'>20060430T162040,60+02</datetime><datetime
 dst='true'>20060430T162107,21+02</datetime><datetime dst='true'>20060430T163828,93+02</datetime><datetime
 dst='true'>20060501T094942,46+02</datetime><datetime dst='true'>20060501T095028,39+02</datetime><datetime
 dst='true'>20060501T101412,59+02</datetime><datetime dst='true'>20060501T104914,32+02</datetime><datetime
 dst='true'>20060501T114738,49+02</datetime><datetime dst='true'>20060501T115259,27+02</datetime></revisions>
<item name='OriginalModTime'><datetime dst='true'>20060501T143234,44+02</datetime></item>

<item name='RTONE'>
<richtext>
<pardef id='1'/>
<par def='1'>TEST</par>
<par def='1'/>
<par def='1'>&lt;&lt;RT:RTTWO&gt;&gt;</par>
<par def='1'/>
<par def='1'>noch mehr Text</par>
</richtext>
</item>


<item name='RTTWO'><richtext>
<pardef id='2'/>
<par def='2'/></richtext></item>

<item name='TextField'><text/></item>

</document>


Ich möchste gerne an fir fett markierte Stelle navigieren, um diesen Node durch einen Node aus einem anderen Dokument zu ersetzen.

Ich kann auch mit folgendem Code mein RichtextFeld ( RTONE ) im Code anspringen ( also offensichtlich das <item name="RTONE"> )

Sub Click(Source As Button)
   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 eNode As NotesDOMElementNode
   Dim i As Integer   
   
   Dim origXML As String
   origXML = "c:\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)
      End If
   Next
   
End Sub

Nur, wie komme ich jetzt weiter ? Wie gelange ich an die gewünschte Stelle ? Nach meiner Vorstellung müsste doch das NextChild von <item> <richtext> sein und dessen nextchild <pardef>, oder ?



eknori (retired):
Hier einmal ein Modell, das das Einfügen über ein FindAndReplace im DXLExport in einem RichTextFeld durchführt. Danach wird das modifizierte XML wieder in das ausgewählte Dokument importiert. Es werden keine IO-Operationen im Filesystem ausgeführt.

Die Textmarke lautet #RT:RTTWO. Der Screenshot ist als Konstante im Code der Schaltfläche ExportModifyImport hinterlegt.



--- Code: ---Const REPLACE_WITH = | <picture height='71px' width='108px'><notesbitmap>
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
BQYIBcMBBwYIBQEGCAXDAQQGCAUBAw0MC8gAAgMExQENBggFFjQeASIXBQYIBcQBAwYIBcMBFgYI
BRASEwEGCAUGCAUGCAUBBggFIhPHAQIZJsIBGxASEwEGCAUGCAUBBggFEBIcAQYILAgFAQYIBcMB
BAYIBQEDDQwLyAACAwTFAQUGCAUBIsIKBjJABQYIBcQBAwYIBcMBBgYIBQEWFMIKDRwBBggFBggF
AQYIRxTECgETxAEBGcMKARPCARcGCAUGCAUBBggFARYUCiUeBggFAQYIBcMBBAYIBQEDDQwLyAAC
AwRACwPHAQMNDAvIAAIDBEALA8cBAw0MC8gAAgMEQAsDxwEDDQwLyAADAwQBQAsExgcDDQwLyAAE
AwQBB0ALAcUDAw0MC8gABQMEAQcDQAsFxAkDDQwLyAAGAwQBBwMJQAsAwwADDQwLyAAGAwQBBwMJ
QAsAwwCWANkBAAAAAAAAAAAAABUAxwEDDQwLyAAGAwQBBwMJQAsAwwADDQwLyAAGAwQBBwMJQAsA
wwADDQwLyAAGAwQBBwMJQAsAwwADDQwLyAAGAwQBBwMJQAsAwwADDQwLyAAGAwQBBwMJQAsAwwAD
DQwLyAAGAwQBBwMJQAsAwwADDQwLyAAGAwQBBwMJQAsAwwADDQwLyAAGAwQBBwMJQAsAwwADDQwL
yAAGAwQBBwMJQAsAwwADDQwLyAAGAwQBBwMJQAsAwwADDQwLyAAGAwQBBwMJQAsAwwADDQwLyAAG
AwQBBwMJQAsAwwADDQwLyAAGAwQBBwMJQAsAwwADDQwLyAAGAwQBBwMJQAsAwwADDQwLyAAEAwQB
B0ADBsYCxBhABwbDAgMNDAvIAAQDBAEHQAMGxgIEGAAbGEAHBsMCAw0MC8gABAMEAQdAAwbGAgQY
ABsYQAcGwwIDDQwLyAAEAwQBB0ADBsYCBBgAGxhABwbDAgMNDAvIAAQDBAEHQAMGwwLEGAIAG8QY
QAcGAw0MC8gABAMEAQdAAwbDAgEYwwDFGwEYywICLj/EDgU6Ri4zN0AEBsICAw0MC8gABAMEAQdA
AwbDAgIOGMYbARjMAgMuMzdABQbCApcA7QAAAP///6jA0NDY6HCYwKjA2HDA0KioqKC4yBhAmODg
4ABAgHBoYJiYoMjI0AAAAIjA0KjAyABQqFBQgBiAyDhAgHCgyKjAuABAmDAwMHBogECAuPjgsDiQ
0NDg6FCo0BhAgJi42CBAWIiAiABgyKiQmABAiABouKjI4BhQqFBQiLjQ4BhAiHCoqHDAyNC4cAgQ
GBhQgBhQmBiAqCAASDhAiDhQgFCouIjY6KjA4ODo8AAAKABQiAgYIBAgMBgwSCAAADhAmDhogDho
mFBogFCAiFCQqGi46HDAuIioqIjAuNjo8Ojw+PDw+JgArgAAAAAAAAAAAAAAAAABAAQAAgAEAAAA
AAAAAAMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAEBAQEB
AQEBAAAAAAAAAAAAAAAAAAAAAAcHBwcHBwcHAAD+/wAAAAAAAAAAAAAAAAkJCQkJCQkJAAAAAAAA
AAAAAAAAAAAAAAICAgICAgICAAAAAAAAAACWPgAAAAAAAA==
</notesbitmap></picture> |

--- Ende Code ---


--- Code: ---Sub Click(Source As Button)
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

' Modify Body with FindAndReplace
' #RT:RTTWO
Dim rtnav As NotesRichTextNavigator
Dim rtrange As NotesRichTextRange
Dim ret As Integer
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

Dim importer As NotesDXLImporter
Set importer = session.CreateDXLImporter(rtItem, db)
importer.DocumentImportOption = DXLIMPORTOPTION_REPLACE_ELSE_IGNORE
Call importer.Process
Call InMemDoc.remove(True)
'doc.form = "Memo"
'doc.SendTo = "Heinz Ulrich Krause/witte/de"
'Call doc.Send(False)
End Sub
--- Ende Code ---

Anbei noch einmal eine aktuelle Sample Database

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln