LOTUSSCRIPT/COM/OLE CLASSES
(Declarations) Dim session As NotesSession Dim inputStream As NotesStream, outputStream As NotesStream Dim domParser As NotesDOMParser Dim docNode As NotesDOMDocumentNode Dim NL As String 'carriage return + line feed Dim nodeCount(12) As Long
Sub Initialize Dim i As Integer Dim j As Long Dim origXML As String, outputFile As String origXML = "c:\dxl\NAB.xml" outputFile = "c:\dxl\DOMnodes.doc" REM your message here! Dim message As String message = "DOM Parser Report - Node Relationships" On Error Goto errh 'open the XML input file and create the report file If Not xmlCreate(origXML,outputFile,message) Then Goto results End If 'create DOM parser and process Set domParser=session.CreateDOMParser(inputStream, outputStream) domParser.Process 'get the document node Set docNode = domParser.Document REM report on parent/child/sibling nodes For i = 0 To 12 nodeCount(i) = 0 Next Call walktree (docNode) outputStream.WriteText (NL+NL+"Report status ---"+NL) For j = 0 To 12 outputStream.WriteText (Cstr(nodeCount(j))+" "+CstrNodeType(j)+"s"+ NL) Next message = NL+"end of file: "+origXML results: outputStream.WriteText (message) Call outputStream.Close Messagebox "Report written to "+outputFile Exit Sub errh: message = Cstr(Err)+": "+Error+Chr(13) Resume results End Sub
Sub walkTree ( node As NotesDOMNode) Dim child As NotesDOMNode Dim numChildNodes As Integer Dim nName As String NL = Chr(13)+Chr(10) If Not node.IsNull Then nName = CstrNodeType(node.NodeType) domParser.Output( nName+" " ) Select Case node.NodeType Case DOMNODETYPE_DOCUMENT_NODE: ' The Document node domParser.Output("Name: "+node.Nodename+NL) If node.ParentNode.IsNull Then domParser.Output(nName+"s have no parent") Else Messagebox "Node cannot have a parent!!", ,nName+" error" Exit Sub End If If node.NextSibling.IsNull And node.PreviousSibling.IsNull Then domParser.Output(" and no siblings"+NL ) Else Messagebox "Node cannot have a sibling!!", ,nName+" error" Exit Sub End If Case Else: domParser.Output("Name: "+node.Nodename+NL) If node.ParentNode.Isnull Then Messagebox "Node must have a parent!!", ,nName+" error" Exit Sub End If If node.NextSibling.IsNull And node.PreviousSibling.IsNull Then domParser.Output(" has no siblings" ) Else domParser.Output(" has a sibling") End If End Select 'node.NodeType If node.HasChildNodes Then Set child = node.FirstChild numChildNodes = node.NumberOfChildNodes If node.NodeType = DOMNODETYPE_DOCUMENT_NODE Then domParser.Output(" has "+Cstr(numChildNodes) ) Else domParser.Output(" and "+Cstr(numChildNodes) ) End If If numChildNodes = 1 Then domParser.Output( " child"+NL) Else domParser.Output( " children"+NL) End If While numChildNodes > 0 Call walkTree(child) Set child = child.NextSibling numChildNodes = numChildNodes - 1 Wend Else domParser.Output(" and no children"+NL) End If 'node.HasChildNodes End If 'Not node.IsNull End Sub
Function xmlCreate (inFile As String, outFile As String, info As String) ' Open the XML file and create the report file Dim db As NotesDatabase Set session = New NotesSession Set db = session.CurrentDatabase 'create the output file Set outputStream =session.CreateStream outputStream.Open (outFile) outputStream.Truncate 'write report title outputStream.WriteText (info+Chr(13)+Chr(10)) 'open the XML file Set inputStream = session.CreateStream inputStream.Open (inFile) If inputStream.Bytes = 0 Then info = "XML file "+ inFile+" is empty" xmlCreate = False Else xmlCreate = True End If End Function
Function CstrNodeType (currentNode As Long) As String 'Given a node type, convert it to a descriptive string. nodeCount(currentNode) = nodeCount(currentNode)+1 Select Case currentNode Case DOMNODETYPE_ELEMENT_NODE: '1 CstrNodeType = "ELEMENT_NODE" Case DOMNODETYPE_ATTRIBUTE_NODE: '2 CstrNodeType = "ATTRIBUTE_NODE" Case DOMNODETYPE_TEXT_NODE: '3 CstrNodeType = "TEXT_NODE" Case DOMNODETYPE_CDATASECTION_NODE: '4 CstrNodeType = "CDATASECTION_NODE" Case DOMNODETYPE_ENTITYREFERENCE_NODE: '5 CstrNodeType = "ENTITYREFERENCE_NODE" Case DOMNODETYPE_ENTITY_NODE: '6 CstrNodeType = "ENTITY_NODE" Case DOMNODETYPE_PROCESSINGINSTRUCTION_NODE: '7 CstrNodeType = "PROCESSINGINSTRUCTION_NODE" Case DOMNODETYPE_COMMENT_NODE: '8 CstrNodeType = "COMMENT_NODE" Case DOMNODETYPE_DOCUMENT_NODE: '9 CstrNodeType = "DOCUMENT_NODE" Case DOMNODETYPE_DOCUMENTTYPE_NODE: '10 CstrNodeType = "DOCUMENTTYPE_NODE" Case DOMNODETYPE_DOCUMENTFRAGMENT_NODE: '11 CstrNodeType = "DOCUMENTFRAGMENT_NODE" Case DOMNODETYPE_NOTATION_NODE: '12 CstrNodeType = "NOTATION_NODE" Case DOMNODETYPE_XMLDECL_NODE: '13 CstrNodeType = "XMLDECL_NODE" End Select End Function
See Also