Examples: Create Node methods

This agent parses the origXML file, creates new nodes and reports on the results in outputFile.

(Declarations)
Dim session As NotesSession
Dim inputStream As NotesStream, outputStream As NotesStream
Dim domParser As NotesDOMParser
Dim docNode As NotesDOMDocumentNode
Dim docRootNode As NotesDOMNode
Dim NL As String            'carriage return + line feed
Dim cstrType(13) As String  'convert node type to descriptive string

Sub Initialize
  Dim origXML As String, outputFile As String
  origXML = "c:\dxl\xmlin.xml"
  outputFile = "c:\dxl\DOMcreatenode.txt"
  NL = Chr(13)+Chr(10)

  cstrType(DOMNODETYPE_ELEMENT_NODE) =  "ELEMENT_NODE"
  cstrType(DOMNODETYPE_ATTRIBUTE_NODE) = "ATTRIBUTE_NODE"
  cstrType(DOMNODETYPE_TEXT_NODE) =  "TEXT_NODE"
  cstrType(DOMNODETYPE_CDATASECTION_NODE) =  "CDATASECTION_NODE"
  cstrType(DOMNODETYPE_ENTITYREFERENCE_NODE) = _
  "ENTITYREFERENCE_NODE"
  cstrType(DOMNODETYPE_ENTITY_NODE) = "ENTITY_NODE"
  cstrType(DOMNODETYPE_PROCESSINGINSTRUCTION_NODE) = _
  "PROCESSINGINSTRUCTION_NODE"  
  cstrType(DOMNODETYPE_COMMENT_NODE) =  "COMMENT_NODE"
  cstrType(DOMNODETYPE_DOCUMENT_NODE) = "DOCUMENT_NODE"
  cstrType(DOMNODETYPE_DOCUMENTTYPE_NODE) = "DOCUMENTTYPE_NODE"
  cstrType(DOMNODETYPE_DOCUMENTFRAGMENT_NODE) = _
  "DOCUMENTFRAGMENT_NODE"
  cstrType(DOMNODETYPE_NOTATION_NODE) = "NOTATION_NODE"
  cstrType(DOMNODETYPE_XMLDECL_NODE) =  "XMLDECL_NODE"
  
  On Error Goto errh
  
  Set session = New NotesSession
  Set outputStream =session.CreateStream
  outputStream.Open (outputFile)
  outputStream.Truncate
  outputStream.WriteText("DOM Create Nodes Report - original tree data"+NL)
  Set inputStream = session.CreateStream
  inputStream.Open (origXML)
  If inputStream.Bytes = 0 Then
    Messagebox "XML file "+ origXML+" is empty"
    Goto closeReport
  End If
  
  Call  createNewNodes
  
closeReport:
  Call outputStream.Close
  Messagebox "Report written to "+outputFile
  Exit Sub
errh:
  Messagebox (Cstr(Err) + ":  " + Error + Chr(13))
  Resume closeReport
End Sub

Sub createNewNodes
  Dim cdataNode As NotesDOMCDATASectionNode
  Dim commentNode As NotesDOMCommentNode
  Dim textNode As NotesDOMTextNode
  Dim docFragNode As NotesDOMDocumentFragmentNode
  Dim newNode As NotesDOMElementNode
  Dim entityrefNode As NotesDOMEntityReferenceNode
  Dim piNode As NotesDOMProcessingInstructionNode
  
  Set domParser=session.CreateDOMParser(inputStream, outputStream)
  domParser.Process
  Set docNode = domParser.Document
  Set docRootNode = docNode.DocumentElement
  
  'report on the tree: create new nodes
  Call walkTree(docRootNode)
  
  'update the tree
  outputStream.WriteText(NL+"DOM Create Nodes Report - modified tree"+NL)
  
  Set commentNode = docNode.CreateCommentNode("created comment node")
  Call docRootNode.AppendChild(commentNode)
  
  Set cdataNode = docNode.CreateCDataSectionNode("some cdata stuff")
  Call docRootNode.AppendChild(cdataNode)
  
  Set textNode =  docNode.CreateTextNode("New text node using a docfragment")
  Set docFragNode = docNode.CreateDocumentFragmentNode
  Call docFragNode.AppendChild(textNode)
  Call docRootNode.AppendChild(docFragNode)
  
  Set newNode = docNode.CreateElementNode("NewElement")
  Call docRootNode.AppendChild(newNode)
  
  Set entityrefNode = docNode.CreateEntityReferenceNode("NewEntity")
  Call docRootNode.AppendChild(entityrefNode)
  
  Set piNode = docNode.CreateProcessingInstructionNode("xml", "version=1.0")
  Call docRootNode.AppendChild(piNode)
  
  'report on updated tree
  Call walkTree(docRootNode)
  
End Sub

Sub walkTree ( node As NotesDOMNode)
  Dim child As NotesDOMNode
  Dim eNode As NotesDOMElementNode
  Dim piNode As NotesDOMProcessingInstructionNode
  Dim nNodes As Integer
  NL = Chr(13)+Chr(10)
  
  If Not node.IsNull Then 'report on the node
    domParser.Output( cstrType(node.NodeType) + NL)
    domParser.Output( "Node name: "+node.NodeName+NL)
    
    Select Case node.NodeType
    'some nodes have more information to report on
      
    Case DOMNODETYPE_DOCUMENT_NODE:
      Set child = node.FirstChild
      nNodes = node.NumberOfChildNodes
      domParser.Output("Node has "+Cstr(nNodes) _
      + " Child Nodes"+NL)
      
      While nNodes > 0
        Call walkTree(child)
        Set child = child.NextSibling
        nNodes = nNodes - 1
      Wend
      
    Case DOMNODETYPE_ELEMENT_NODE:
      Set eNode = node
      
      Set child = node.FirstChild
      nNodes = node.NumberOfChildNodes
      domParser.Output("Node has "+Cstr(nNodes) _
      + " Child Nodes"+NL)
      
      While nNodes > 0
        Call walkTree(child)
        Set child = child.NextSibling
        nNodes = nNodes - 1
      Wend
      
    Case DOMNODETYPE_TEXT_NODE:
      domParser.Output( "Node value: "+node.NodeValue+NL)
      
    Case DOMNODETYPE_COMMENT_NODE:
      domParser.Output( "Node value: "+node.NodeValue+NL)
      
    Case DOMNODETYPE_PROCESSINGINSTRUCTION_NODE:
      Set piNode = node
      domParser.Output("Target:  "+piNode.Target +NL)
      domParser.Output( "Data: "+piNode.Data+NL)
      
    Case DOMNODETYPE_ENTITY_NODE:
      domParser.Output( "Node value: "+node.NodeValue+NL)
      
    Case DOMNODETYPE_CDATASECTION_NODE:
      domParser.Output( "Node value: "+node.NodeValue+NL)
      
    Case DOMNODETYPE_ATTRIBUTE_NODE:
      domParser.Output( "Node value: "+node.NodeValue+NL)
      
    Case DOMNODETYPE_DOCUMENTFRAGMENT_NODE:
      domParser.Output( "Node value: "+node.NodeValue+NL)
      
    Case DOMNODETYPE_NOTATION_NODE:
      domParser.Output( "Node value: "+node.NodeValue+NL)
      
    Case DOMNODETYPE_XMLDECL_NODE:
      domParser.Output( "Node value: "+node.NodeValue+NL)
      
    End Select 'node.NodeType
  End If 'Not node.IsNull
End Sub