Jan
11
Posted (Johan Känngård) in LotusScript, XML on 2006-01-11

In my earlier post today, I described a problem I have, where I wanted to get the XML string of a DOM tree. I’ve started writing my own routine, this is what I have right now. It’s far from complete, since it can not handle namespaces, CDATA etc. yet:
This is a new version that handles siblings better, and not getting out of stack space :-)


Public Sub serializeNode(node As NotesDOMNode_
, outStream As NotesStream)
  On Error Goto catch
  
  If node.IsNull Then Exit Sub
  
  Dim currentNode As NotesDOMNode
  Set currentNode = node
  
  Do Until currentNode.isNull
    Select Case currentNode.nodeType
    Case DOMNODETYPE_DOCUMENT_NODE
    Case DOMNODETYPE_XMLDECL_NODE
      Dim xmlDecl As NotesDOMXMLDeclNode
      Set xmlDecl = currentNode
      Call outStream.WriteText("< ?xml version=""" _
+ xmlDecl.version + """ encoding=""" + xmldecl.encoding + """?>")
    Case DOMNODETYPE_ELEMENT_NODE
      Call outStream.writeText("< " + currentNode.nodeName + "")
      Dim nodeMap As NotesDOMNamedNodeMap
      Set nodeMap = currentNode.attributes
      Dim attribute As NotesDOMNode
      Dim i As Integer
      
      For i = 1 To nodeMap.numberOfEntries
        Set attribute = nodeMap.getItem(i)
        Call outStream.WriteText(" " + attribute.nodeName + "=")
        Call outStream.WriteText("""" + attribute.NodeValue + """")
      Next i
      Call outStream.writeText(">")
    Case DOMNODETYPE_TEXT_NODE
      Call outStream.writeText(currentNode.NodeValue)
    Case DOMNODETYPE_COMMENT_NODE
      Call outStream.writeText("<!--" _
+ currentNode.NodeValue + "-->")
    Case Else
      Error 2000, "Unhandled node type [" _
& currentNode.nodeType & "]"
    End Select
    
    Dim endWritten As Boolean
    
    If currentNode.hasChildNodes Then
      Call serializenode(currentNode.firstChild, outStream)
    End If
    
    If currentNode.NodeType = DOMNODETYPE_ELEMENT_NODE Then
      Call outStream.writeText("")
      endWritten = True
    End If
    
    Set currentNode = currentNode.nextSibling
  Loop
  
  If node.NodeType = DOMNODETYPE_ELEMENT_NODE _
And Not endWritten Then
    Call outStream.writeText("")
  End If
  Exit Sub
catch:
  Error Err, Err & Lsi_Info(2) & ":" & Erl & "|" & Error
End Sub


Comments:
Dwight Wilbanks on January 13th, 2006 at 15:42:59 #

Im afraid that I don’t understand the problem very well. Why doesn’t the built in Serialize method work?

Johan Känngård on January 13th, 2006 at 16:32:19 #

Se my earlier post:
Serialize a DOM tree in LotusScript?.
The problem is that I don’t have access to the NotesDOMParser that was used to create the DOM tree. The buil in Serialize method only exists in the NotesDOMParser, and in my case, I already have a parsed tree and are passing NotesDOMNodes around different classes/methods. One of the methods should serialize the whole tree to disk, and that is only possibly if I do the parsing and serializing in one “sweep”. Do you get it?

Post a comment
Name: 
Email: 
URL: 
Comments: