Autor Thema: RichText in RichText EINFÜGEN  (Gelesen 45570 mal)

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
RichText in RichText EINFÜGEN
« am: 30.04.06 - 15:18:58 »
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 ...

« Letzte Änderung: 30.04.06 - 17:58:56 von eknori »
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #1 am: 30.04.06 - 17:18:26 »
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 ...


Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: RichText in RichText EINFÜGEN
« Antwort #2 am: 01.05.06 - 00:36:23 »
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)

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 eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #3 am: 01.05.06 - 14:41:02 »
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 ?



Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #4 am: 01.05.06 - 16:45:06 »
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> |

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

Anbei noch einmal eine aktuelle Sample Database
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #5 am: 01.05.06 - 18:15:29 »
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ß
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #6 am: 01.05.06 - 18:35:55 »
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

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>
« Letzte Änderung: 01.05.06 - 18:52:28 von eknori »
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #7 am: 01.05.06 - 19:39:20 »
<offtopic> Irgendwie scheint so kein anderer in das Thema mit einsteigen zu wollen, gell ? </offtopic>

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

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: RichText in RichText EINFÜGEN
« Antwort #8 am: 01.05.06 - 19:50:05 »
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
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: RichText in RichText EINFÜGEN
« Antwort #9 am: 01.05.06 - 20:41:40 »
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

... 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 :-)
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: RichText in RichText EINFÜGEN
« Antwort #10 am: 01.05.06 - 22:07:44 »
Hab das nochmal kurz ein bischen erweitert.
Er überprüft jetzt auch childs von <richtext>
Sicher vom code her nicht das gelbe. Man sollte das irgendwie rekursiver und vielleicht auch wiederverwendbarer machen. Jedenfalls iteriert er jetzt über die pars, pardefs oder wie immer die heissen.

Allgemein gute Ideen:
Mit der Superklasse NotesDomNode arbeiten. Diese gehört einer von 13 Typen an (s. Attribut NodeType).
In dieser Klasse gibts btw. auch Methoden zum anhängen (nur am Ende einer Liste -> outch), ersetzen und entfernen.

Beim Erstellen einer Node gibts einen Trick.  Unwahrscheinlich, dass ich das heute abend noch packe.

Hier nur noch ein Teil des obigen Skripts. den block einfach austauschen.

Code
oben in den dims: Dim nodeChildRichText As NotesDOMNode
If enode.GetAttribute("name") = "RTONE" Then
			Msgbox "found at position " & Cstr(i)
			Stop
			If enode.hasChildNodes Then
				
				Set nodeChildOfRTOne = enode.FirstChild
				While Not (nodeChildOfRTOne.isNull)
					Msgbox nodeChildOfRTOne.NodeName & " vom Typ : " & Cstr(nodeChildOfRTOne.NodeType) 
					If nodeChildOfRTOne.NodeName = "richtext" Then 
						If nodeChildOfRtOne.hasChildNodes Then 
							Set  nodeChildRichText = nodeChildOfRTOne.FirstChild
							While Not (nodeChildRichText.IsNull) 
								Msgbox "kind von <richtext>:" & nodeChildRichText.nodeName & " vom Typ: " & Cstr(nodeChildRichText.NodeType) 
								
								Set nodeChildRichText = nodeChildRichText.nextSibling 
								
							Wend
						End If
						
						
					End If
					Set nodeChildOfRTOne = nodeChildOfRTOne.nextSibling
				Wend
				
				
			End If
		End If

« Letzte Änderung: 02.05.06 - 06:06:00 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 flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: RichText in RichText EINFÜGEN
« Antwort #11 am: 02.05.06 - 08:46:34 »
Frage: Ist das irgendwie hilfreich oder nicht?
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 eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #12 am: 02.05.06 - 08:57:14 »
Hallo Axel, ja, das hilft schon ein Stück weiter. Zumindest komme ich jetzt an die <par ... > nodes ran.
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: RichText in RichText EINFÜGEN
« Antwort #13 am: 02.05.06 - 11:58:55 »
Ein nächster Schritt wäre dann dies:
Code
Set notesDOMNode = notesDOMNode.ReplaceChild( newChild, oldChild )
Dazwischen mußt du aber die newChild erst noch erzeugen.

Für die Erzeugung von Nodes hat die Klasse:
NotesDOMDocumentNode class
createMethoden (Factory-method).
« Letzte Änderung: 02.05.06 - 12:02:31 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 eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #14 am: 02.05.06 - 15:24:34 »
So, hier erst einmal der Code, um die Einfügemarke RT:RTONE im RichtextFeld RTONE zu finden

Code
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 nodeChildOfRTOne As NotesDOMNode
	Dim nodeChildRichText As NotesDOMNode
	
	Dim eNode As NotesDOMElementNode
	Dim parNode 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)
			
			If enode.hasChildNodes Then
				
				Set nodeChildOfRTOne = enode.FirstChild
				While Not (nodeChildOfRTOne.isNull)
					'Msgbox nodeChildOfRTOne.NodeName & " vom Typ : " & Cstr(nodeChildOfRTOne.NodeType)
					If nodeChildOfRTOne.NodeName = "richtext" Then
						If nodeChildOfRtOne.hasChildNodes Then
							Set  nodeChildRichText = nodeChildOfRTOne.FirstChild
							While Not (nodeChildRichText.IsNull)
								'Msgbox "kind von <richtext>:" & nodeChildRichText.nodeName & " vom Typ: " & Cstr(nodeChildRichText.NodeType)
								If nodeChildRichText.NodeName = "par" Then
									'Msgbox nodeChildRichText.NodeName
									Set parnode = nodeChildRichText
									If ( Not parNode.FirstChild.IsNull ) Then
										If ( Not Isnull (parnode.FirstChild.NodeValue ) ) Then
											If parnode.FirstChild.NodeValue = "RT:RTONE" Then
												Msgbox "HEUREKA"
											End If
										End If
										
									End If
									
								End If
								
								Set nodeChildRichText = nodeChildRichText.nextSibling
								
							Wend
						End If
						
						
					End If
					Set nodeChildOfRTOne = nodeChildOfRTOne.nextSibling
				Wend
			End If
		End If
	Next
	
End Sub


Funktioniert auch bei einer XML Datei mit 10MB in knapp einer Sekunde. Ist also für eine Hintergrundaktion genügend performant, denke ich ...

Der Code müsste auch verwendbar sein, um die <par ... > Nodes des RT Feldes auszulesen, dessen Werte eingefügt werden sollen.
« Letzte Änderung: 02.05.06 - 15:30:36 von eknori »
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: RichText in RichText EINFÜGEN
« Antwort #15 am: 02.05.06 - 15:48:15 »
Man sollte das deutlich schöner machen können.
Ich werds versuchen. Hier traue ich Thomas Völk übrigens gute Vorschläge zu  ;)
Aber erst einmal die Funktionalität durchprogrammieren.
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 eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #16 am: 02.05.06 - 16:03:54 »
Mir geht es momentan auch erst einmal darum, die nötigen Funktionen zusammenzubekommen. "Schön machen" kann man das dann immer noch.  :D
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re: RichText in RichText EINFÜGEN
« Antwort #17 am: 02.05.06 - 18:16:13 »
Mein erster Vorschlag wäre, einen anderen Parser zu nehmen. Der NotesDOMParser kann sehr wenig, wenn ich das noch richtig in Erinnerung habe. Andere Parser unterstützen z. B. XPath-Anweisungen, mit denen du dir die Schleife über alle Knoten sparen kannst, um einen oder mehrere bestimmte zu finden. Das würde allerdings bedeuten, dass du das in Java machen müsstest.
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline Thomas Schulte

  • @Notes Preisträger
  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 4.388
  • Geschlecht: Männlich
  • Ich glaub mich tritt ein Pferd
Re: RichText in RichText EINFÜGEN
« Antwort #18 am: 02.05.06 - 18:38:58 »
Das entscheidende an dem Teil ist, das es mit Notes native funktionieren muss. Und das ohne noch irgendwas zusätzlich zu installieren.
Thomas Schulte

Collaborative Project Portfolio and Project Management Software

"Aber wo wir jetzt einmal soweit gekommen sind, möchte ich noch nicht aufgeben. Versteh mich recht, aufgeben liegt mir irgendwie nicht."

J.R.R.Tolkien Herr der Ringe, Der Schicksalsberg

OpenNTF Project: !!HELP!! !!SYSTEM!!  !!DRIVER!!

Skype: thomasschulte-kulmbach

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: RichText in RichText EINFÜGEN
« Antwort #19 am: 02.05.06 - 20:32:50 »
Versuchen wir es erst einmal mit den Notes libraries. Vielleicht bekäme man dom4j (mein Favorit) oder ähnliches in domino 7 ans laufen. Aber dann vielleicht wieder nicht als an den Agenten angehängtes jar sondern nur im lib Verzeichnis. Und wenn das auf userworkstations laufen soll, dann müßte man das erst einmal verteilen...
In Notes 6 (Name dieses Forums) kann man das vermutlich eh vergessen, da erst mit Notes 7 ein JAXP kompatibler xml parser überhaupt in notes Java eingeführt wurde. 
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