Domino 9 und frühere Versionen > ND6: Entwicklung

RichText in RichText EINFÜGEN

<< < (3/14) > >>

flaite:
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

--- Ende Code ---

flaite:
Frage: Ist das irgendwie hilfreich oder nicht?

eknori (retired):
Hallo Axel, ja, das hilft schon ein Stück weiter. Zumindest komme ich jetzt an die <par ... > nodes ran.

flaite:
Ein nächster Schritt wäre dann dies:

--- Code: ---Set notesDOMNode = notesDOMNode.ReplaceChild( newChild, oldChild )

--- Ende Code ---
Dazwischen mußt du aber die newChild erst noch erzeugen.

Für die Erzeugung von Nodes hat die Klasse:
NotesDOMDocumentNode class
createMethoden (Factory-method).

eknori (retired):
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


--- Ende Code ---

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.

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln