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

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: RichText in RichText EINFÜGEN
« Antwort #20 am: 02.05.06 - 20:38:50 »
hab ich eben über google gefunden.
Rocky Oliver ist mein 2.-Lieblings-Loti. Hinter Bob Balaban.
http://www.lotusgeek.com/SapphireOak/LotusGeekBlog.nsf/d6plinks/ROLR-6CPL56
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 #21 am: 02.05.06 - 20:52:02 »
Hilft dieser Stan Rogers code weiter:
Oder vielleicht wendest du dich einfach an ihn. Normal gibt der sich ja sehr hilfsbereit (ich glaub 60% der Antworten zu Programmierfragen in Notes-Foren sind von ihm). Ansonsten kann ich auch weitermachen. Hab aber z.Zt. ziemlich viel anderen Kram.

Code
Function CrossDocClone(SourceNode As NotesDOMNode, TargetParentNode As NotesDOMNode) As NotesDOMNode

Dim NewNode As NotesDOMNode
Dim NewChildNode As NotesDOMNode
Dim NextNode As NotesDOMNode
<error handling statement goes here -- there may be failures>

%REM
This assumes the following objects are Global
SourceRootDoc -- the NotesDOMDocumentNode that clones are drawn from
TargetRootDoc -- the NotesDOMDocumentNode that clones are inserted into
%END REM

Select Case SourceNode.NodeType
'ignoring attribute, comment, document and entity types
Case DOMNODETYPE_ELEMENT_NODE
Set NewNode = TargetRootDoc.CreateElementNode(SourceNode.NodeName)
Case DOMNODETYPE_TEXT_NODE
Set NewNode = TargetRootDoc.CreateTextNode(SourceNode.NodeValue)
Case DOMNODETYPE_CDATASECTION_NODE
Set NewNode = TargetRootDoc.CreateCDATASectionNode(SourceNode.NodeValue)
End Select
If SourceNode.HasAttributes Then
Dim map As NotesDOMNamedNodeMap
Dim attrib As NotesDOMAttributeNode
Dim count As Integer
Set map = SourceNode.Attributes
For count = 1 To map.NumberOfElements
Set attrib = map.GetItem(count)
Call NewNode.SetAttribute(attrib.NodeName, attrib.NodeValue)
Next
End If
Call TargetParentNode.AppendChild(NewNode)

If SourceNode.HasChildNodes Then
Set NextNode = SourceNode.FirstChild
Set NewChildNode = CrossDocClone(NextNode, NewNode)
Set NextNode = NextNode.NextSibling
While Not NextNode.IsNull
Set NewChildNode = CrossDocClone(NextNode, NewNode)
Wend
End If
End Function
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 #22 am: 03.05.06 - 06:25:38 »
Ein Weg, um eine Node zu erzeugen (und in eine vorhandene DOM-Repräsentation eines xml-Dokuments einzuhängen) sieht wie folgt aus:

1. DomDocumentNode-Objekt erzeugen:
Code
Dim docNode As NotesDOMDocumentNode
[...]
Set docNode = domParser.Document	

2. Mit docNode (!) eine DomElement erzeugen.
Code
Dim newNode as notesDOMElementNode
[...]
Set newNode = docNode.CreateElementNode("NewElement")
docNode repräsentiert das im Parser aktive (spelling?) xml-Document
Dies erzeugt ein <newElement></newElement> (Attribute, childNodes als Text oder als weitere nodes können da sicher angefügt werden).

3. newNode an eine existierende node anhängen:
Code
Call nodeChildRichText.AppendChild(newNode)

Der entsprechende code in meinem Beispielcode sieht so aus:
Code
 
If nodeChildRichText.NodeName = "pardef" Then 
Stop
Set newNode = docNode.CreateElementNode("NewElement")
Call nodeChildRichText.AppendChild(newNode)
End If
Aber wie hängt man jetzt eine Node aus einem anderen xml Dokument ein?
Man kann alle Bestandteile dieser Node auslesen (nodeName, enthaltener Text, enthaltene Nodes, Attribute-Nodes) und daraus eine neue Node erzeugen. Aber vielleicht gibts einen besseren Weg.


Aus
Code
<item name='RTTWO'><richtext>
<pardef id='2'/>
<par def='2'/></richtext></item>
wird wohl:
Code
<item name='RTTWO'><richtext>
<pardef id='2'>
<newElement/>
</pardef>
<par def='2'/></richtext></item>
Nicht was du wolltest, aber vielleicht ein Starter.

Ich hab auch Probleme das manipulierte xml in eine Datei herauszuschreiben. Kann mir da jemand helfen?

Axel
« Letzte Änderung: 03.05.06 - 06:35:12 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.730
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #23 am: 03.05.06 - 07:19:30 »
Zitat
Ich hab auch Probleme das manipulierte xml in eine Datei herauszuschreiben. Kann mir da jemand helfen?

Ich mache das vielleicht ein wenig umständlich, aber so bekomme ich das hin.

ich DXL - exporte das doc in ein RTITEM, mache dort die Manipulationen. Anschließend DXL - importe ich die Änderungen wieder in das doc und streame dann einen DXLExport in eine Datei.  ::) :P

Den Code von Rocky habe ich auch schon gesehen, aber noch nicht richtig verstanden.

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 #24 am: 03.05.06 - 07:26:07 »
Jedenfalls kannst du mit meinem code mal versuchen, dort irgendwo eine neue node einzuhängen?
Oder kannst du mir deinen code schicken, damit ich das damit mal versuchen kann. Wenn es eine kleine Test.nsf ist, geht es ja.
appendChild funktioniert jedenfalls. Und da gibts noch replaceChild.

Gruß Axel
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.730
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #25 am: 03.05.06 - 07:28:49 »
kann ich dir frühestens heute abend schicken; heute ist wieder Grosskampftag in der Firma ( Helpdesk Schulung *grins* )
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.730
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #26 am: 03.05.06 - 07:38:09 »
Axel: du kannst aber auch direkt in eine Datei streamen. Da brachst du dann einen outputStream, . Dem DOMParser teilst du dann diesen output mit setOutput ( stream ) mit.

Das mit dem RTITEM habe ich deshalb gemacht, damit ich mir die Änderungen direkt im Dokument ansehen kann.

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 #27 am: 03.05.06 - 08:31:46 »
Das Zauberwort heißt Pipelining. Wenn du das verstanden hast ist alles ganz einfach :)

Zitat von hier
Zitat
Pipelining works because the XML processors require you to identify input and output before you call the Process method on the first object in the line. The simplest way to set up a pipeline is to specify the inputs for all the processes, but no outputs except for the output of the last process in the line.

Und von hier.
Zitat
The whole point of a pipeline is that it all runs at the same time. It does not process each stage separately. Set the pipleine up, then call Process on the first stage in the pipeline. Do not call Process on the other stages. The first stage pushes the data through all the stages that you have set up.
Beiträge im Forum von diesem Rod Whiteley zum Thema DXL kann ich nur empfehlen. Die haben mir immer sehr geholfen.
« Letzte Änderung: 03.05.06 - 08:35:36 von Thomas Völk »
Thomas

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

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #28 am: 03.05.06 - 08:33:35 »
Stümmt, bin auch auch gerade drauf gestossen  ::)
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.730
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #29 am: 03.05.06 - 19:24:23 »
*HaareRauf* Gerade, als ich dachte, ich hätte das Pipelining verstanden, .... bin ich so schlau als wie zuvor .

Der Exporter übergibt an den Parser, der Parser parsed, übergibt aber nicht an den Importer ( so sieht es zumindest aus ) Der Code läuft fehkerfrei durch. Im Debugger sieht man auch, daß

Zitat
parnode.FirstChild.NodeValue = "Hallo Welt"

gesetzt wird. Also müsst edoch das Document aktualisiert werden.  ???

Das ist das "Dumme" beim Pipeline; man sieht irgendwie nicht mehr, was passiert ...

Code
Sub Click(Source As Button)
	
	Dim session As New NotesSession
	Dim db As NotesDatabase
	Set db = session.CurrentDatabase
	
	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 cloneNode As NotesDOMNode   
	Dim i As Integer   
	
	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 exporter As NotesDXLExporter
	Dim domParser As NotesDOMParser
	
	Set exporter = session.CreateDXLExporter
	Set domParser=session.CreateDOMParser 
	
	Call exporter.SetInput ( doc )
	Call exporter.SetOutput ( domParser )
	Call exporter.process
	
	Set rootElement = domParser.Document.DocumentElement
	Set docList = rootElement.GetElementsByTagName ( "item" )
	
	If docList.NumberOfEntries = 0 Then :	Exit Sub
	
	For i = 1 To docList.NumberOfEntries
		Set node = docList.GetItem( i )
		Set enode = node
		If enode.GetAttribute("name") = "RTONE" Then
			If enode.hasChildNodes Then
				Set nodeChildOfRTOne = enode.FirstChild
				While Not (nodeChildOfRTOne.isNull)
					If nodeChildOfRTOne.NodeName = "richtext" Then
						If nodeChildOfRtOne.hasChildNodes Then
							Set  nodeChildRichText = nodeChildOfRTOne.FirstChild
							While Not (nodeChildRichText.IsNull)
								If nodeChildRichText.NodeName = "par" Then
									Set parnode = nodeChildRichText
									If ( Not parNode.FirstChild.IsNull ) Then ' skip NULL Values
										If parnode.FirstChild.NodeValue = "RT:RTONE" Then
											parnode.FirstChild.NodeValue = "Hallo Welt"
											Msgbox "HEUREKA"
										Else
										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
	
	
	Dim importer As  NotesDXLImporter
	Set importer = session.CreateDXLImporter
	Call importer.SetInput ( domParser )
	Call importer.SetOutput ( db )
	
End Sub
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.730
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #30 am: 03.05.06 - 21:06:11 »
Habe es mal ins LDD gepostet und, wie erhofft, eine Antwort von Stan Rogers erhalten.

https://www-10.lotus.com/ldd/nd6forum.nsf/DateAllThreadedweb/024f2d5bde011f06852571630063abaf?OpenDocument
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 #31 am: 03.05.06 - 21:58:49 »
Klasse. Ich hab mir auch jetzt ein bischen die Zähne ausgebissen.
Bin aber auch müde. Der hat auf jeden Fall etwas verstanden das ich nicht sehe.
Interessant.

bleib dran
Axel
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 #32 am: 03.05.06 - 22:29:53 »
Sind in dem auf notes.net geposteten code Exporter/Importer auch NotesDOMParser Objekte?
Das glaub ich.
Kriegs aber z.Zt. nicht hin.
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 #33 am: 03.05.06 - 23:08:48 »
Nö. Leider immer noch nicht.

Agent:

Options:
Code
Option Public
Option Declare

Declarations:
Code
Dim session As NotesSession

Initialize:
Code
Dim db As NotesDatabase
	Dim inputStream As NotesStream
	
	
	Dim docNode As NotesDOMDocumentNode
	Dim domParser As NotesDOMParser
	
	Dim Importer As NotesDOMParser
	Dim rootElement As NotesDOMElementNode
	Dim docList As NotesDOMNodeList   
	Dim node As NotesDOMNode   
	Dim newNode As NotesDOMNode
	Dim nodeChildOfRTOne As NotesDOMNode	
	Dim nodeChildRichText As NotesDOMNode
	
	Dim eNode As NotesDOMElementNode
	Dim i As Integer   
	
	Dim origXML As String
	Dim outputFile As String	
	Dim outputStream As NotesStream
	Dim exporter As NotesDOMParser
	
	
	
	origXML = "c:\temp\RichText.xml"
	
	Set session = New NotesSession   
	Set db = session.CurrentDatabase
	
	Set inputStream = session.CreateStream
	
	inputStream.Open (origXML)
	
	
	Set exporter=session.CreateDOMParser ()	
	Set domParser = session.CreateDOMParser()
	Set Importer=session.CreateDOMParser ( inputStream)
	
	outputFile = "c:\temp\RichTextNew.xml"	
	Set outputStream = session.CreateStream	
	outputStream.Open(outputFile)
'	Set input for Exporter
'Set output for Exporter
'Set output for Parser
	Call exporter.setInput(domParser)
	Call exporter.setOutput(outputStream)
	Call domParser.setInput(importer)
	
	
	
	
	importer.Process
	On Event PostDOMParse From domParser Call PlayWithDXLRoutine	
	
	Set docNode = domParser.Document	
	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
			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 = "pardef" Then 
									Stop
									Set newNode = docNode.CreateElementNode("NewElement")
									Call nodeChildRichText.AppendChild(newNode)
								End If
								Set nodeChildRichText = nodeChildRichText.nextSibling 
								
							Wend
						End If
						
						
					End If
					Set nodeChildOfRTOne = nodeChildOfRTOne.nextSibling
				Wend
				
				
			End If
		End If
	Next
	Stop
	

Subroutine:
Code
Public Sub PlayWithDxlRoutine(domParser As NotesDomParser) 
	
	
	domParser.serialize
	
	
End Sub

2 files in c:\temp
RichText.xml und RichTextNew.xml
RichTextNew.xml kann einfach eine leere Datei sein.

RichText.xml
Code
<?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 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.730
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #34 am: 04.05.06 - 07:41:29 »
So, dank Stan Rogers habe ich es jetzt hinbekommen,

Zitat
'DOMParser:

Option Declare

Dim domParser As NotesDOMParser
Dim exporter As NotesDXLExporter
Dim importer As  NotesDXLImporter


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
   
   Set exporter = session.CreateDXLExporter
   Set domParser=session.CreateDOMParser
   Set importer = session.CreateDXLImporter ( domParser, db )
   importer.DocumentImportOption = DXLIMPORTOPTION_REPLACE_ELSE_IGNORE
   
   Call exporter.SetInput ( doc )
   Call exporter.SetOutput ( domParser )
   Call domParser.SetOutput ( importer )
   On Event PostDOMParse From domParser Call PlayWithDXLRoutine   
   Call exporter.process
   
End Sub


Sub PlayWithDXLRoutine(Source As NotesDOMParser)
   Dim eNode As NotesDOMElementNode
   
   Dim cloneNode As NotesDOMNode   
   Dim i As Integer   
   Dim rootElement As NotesDOMElementNode
   Dim docList As NotesDOMNodeList   
   Dim node As NotesDOMNode   
   Dim nodeChildOfRTOne As NotesDOMNode
   Dim nodeChildRichText As NotesDOMNode
   Dim parNode As NotesDOMElementNode
   Set rootElement = domParser.Document.DocumentElement
   Set docList = rootElement.GetElementsByTagName ( "item" )
   
   If docList.NumberOfEntries = 0 Then :   Exit Sub
   
   For i = 1 To docList.NumberOfEntries
      Set node = docList.GetItem( i )
      Set enode = node
      If enode.GetAttribute("name") = "RTONE" Then
         If enode.hasChildNodes Then
            Set nodeChildOfRTOne = enode.FirstChild
            While Not (nodeChildOfRTOne.isNull)
               If nodeChildOfRTOne.NodeName = "richtext" Then
                  If nodeChildOfRtOne.hasChildNodes Then
                     Set  nodeChildRichText = nodeChildOfRTOne.FirstChild
                     While Not (nodeChildRichText.IsNull)
                        If nodeChildRichText.NodeName = "par" Then
                           Set parnode = nodeChildRichText
                           If ( Not parNode.FirstChild.IsNull ) Then ' skip NULL Values
                              If parnode.FirstChild.NodeValue = "RT:RTONE" Then
                                 parnode.FirstChild.NodeValue = "Hallo Welt"
                                 Msgbox "HEUREKA"
                              Else
                              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
   Call Source.Serialize
End Sub


Der Code ersetzt alle Vorkommen von RT:RTONE im gewählten Dokument durch die ausdrucksstarken Worte "Hallo Welt". Beeindruckend  ;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 Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
Re: RichText in RichText EINFÜGEN
« Antwort #35 am: 04.05.06 - 08:10:51 »
Hallo Leute!

Habe diesen Thread leider erst jetzt entdeckt. Hatte genau diese Anforderung auch vor einiger Zeit. Bin über das fehlerhafte Einfügen von RichText gestossen und habe es dann mit DXL probiert. Hat auch prinzipiell geklappt nur jetzt kommts. DXL ist zumindest in unserer Notes Version 6.0.5 nicht vollständig implementiert. Das heisst, wenn du schönen RichText mit etwas aufwendigeren Formatierungen hast, dann schmeisst er alle Formatierungen die im DXL keine Entsprechung haben einfach weg. Ich habe es erst gemerkt als ich fertig war und mit Echtdaten getestet habe. Ich musste das ganze dann noch ein drittes mal machen und war echt Sauer auf die Programmierer von Lotus, die immer tolle Funktionen einbauen, die dann aber die eine oder andere Einschränkung haben, die die Verwendung behindern.

Grüße

Ralf

P.S. Trotzdem Gratulation und Danke für den tollen Code
Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #36 am: 04.05.06 - 08:20:52 »
Zitat
P.S. Trotzdem Gratulation und Danke für den tollen Code

Merci . Mühsam ernährt sich das Eichhörnchen  :D

Hast du evtl noch ein paar Tipps, wie man das ReplaceChild so füttert, daß man eine komplette XML Struktur einfügen kann ??

Prinzipiell funktioniert das:

Zitat
                              If parnode.FirstChild.NodeValue = "RT:RTONE" Then
                                 'parnode.FirstChild.NodeValue = "HELLO WORLD"
                                 Set cloneNode = parNode.FirstChild.clone (False)
                                 clonenode.NodeValue = REPLACE_WITH
'                                 Set notesDOMNode = notesDOMNode.ReplaceChild( newChild, oldChild )
                                 Set replaceNode = parnode.ReplaceChild ( clonenode, parNode.FirstChild )

Aber das Replace_With wird als Text eingefügt  ::)
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
Re: RichText in RichText EINFÜGEN
« Antwort #37 am: 04.05.06 - 08:35:47 »
Hallo Ulrich!

Habe es nicht in Lotus script gemacht sondern in Java, da ich das ganze sowieso in einem Java Programm gebraucht hätte. Wenn ich mich noch richtig erinnere fügte er wenn man einen ChildNode einfügt, der ein DocumentFragment ist automatisch den gesamten Unterbaum ein. Wie gesagt, ich habe es dann nach dem ein Prototyp gelaufen ist nicht mehr verfolgt auf  Grund der Einschränkung von DXL. Hattest du noch nicht diese Probleme, dass DXL nicht alle Formatierungen kann, bzw wie willst du in Zukunft damit umgehen?

Grüße

Ralf
Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #38 am: 04.05.06 - 08:37:50 »
Zitat
Hattest du noch nicht diese Probleme, dass DXL nicht alle Formatierungen kann, bzw wie willst du in Zukunft damit umgehen?

Ich glaube, bis dahin bin ich noch nicht vorgedrungen ...
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 #39 am: 04.05.06 - 08:53:54 »
Zitat
P.S. Trotzdem Gratulation und Danke für den tollen Code

Merci . Mühsam ernährt sich das Eichhörnchen  :D

Hast du evtl noch ein paar Tipps, wie man das ReplaceChild so füttert, daß man eine komplette XML Struktur einfügen kann ??

Prinzipiell funktioniert das:

Zitat
                              If parnode.FirstChild.NodeValue = "RT:RTONE" Then
                                 'parnode.FirstChild.NodeValue = "HELLO WORLD"
                                 Set cloneNode = parNode.FirstChild.clone (False)
                                 clonenode.NodeValue = REPLACE_WITH
'                                 Set notesDOMNode = notesDOMNode.ReplaceChild( newChild, oldChild )
                                 Set replaceNode = parnode.ReplaceChild ( clonenode, parNode.FirstChild )

Aber das Replace_With wird als Text eingefügt  ::)

Was bedeutet denn "wird als Text eingefügt".
Könntest du mal ein kleines Beispiel zeigen, wie es aussieht und eins wie es aussehen soll? Vielleicht kann ich mir dann besser was drunter vorstellen.

Das Attribut NodeValue, das du mit dem REPLACE_WITH befüllst, ist abhängig vom NodeType. Vielleicht liegts daran
Thomas

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

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz