Previous Application Programming: Using the XML DOM Object Classes Next

Tree-Walking Example

The following code traverses a DOM tree using pre-order traversal.

PRO sample_recurse, oNode, indent  
  
   ; "Visit" the node by printing its name and value  
   PRINT, indent GT 0 ? STRJOIN(REPLICATE(' ', indent)) : '', $  
      oNode->GetNodeName(), ':', oNode->GetNodeValue()  
  
   ; Visit children  
   oSibling = oNode->GetFirstChild()  
   WHILE OBJ_VALID(oSibling) DO BEGIN  
      SAMPLE_RECURSE, oSibling, indent+3  
      oSibling = oSibling->GetNextSibling()  
   ENDWHILE  
END  
  
PRO sample  
   oDoc = OBJ_NEW('IDLffXMLDOMDocument')  
   oDoc->Load, FILENAME="sample.xml"  
   SAMPLE_RECURSE, oDoc, 0  
   OBJ_DESTROY, oDoc  
END  

This program generates the following output for the plug-in file (see About the DOM Structure):

#document:  
   plugin:  
      #text:  
  
      name:  
         #text:Weather.com Radar Image [DEN]  
      #text:  
  
      description:  
         #text:600 mile Doppler radar image for DEN  
      #text:  
  
      version:  
         #text:1.0  
      #text:  
  
      tab:  
         #text:  
  
         icon:  
            #text:weather.gif  
         #text:  
  
         tooltip:  
            #text:DEN Doppler radar image  
         #text:  
  
      #text:  

The program above created an IDLffXMLDOM object for every node it encountered and did not destroy them until the document was destroyed. Another approach, illustrated in the program below, cleans up the nodes as it proceeds:

PRO sample_recurse2, oNode, indent  
   ;; "Visit" the node by printing its name and value  
   PRINT, indent gt 0 ? STRJOIN(REPLICATE(' ', indent)) : '', $   
      oNode->GetNodeName(), ':', oNode->GetNodeValue()  
  
   ;; Visit children  
   oNodeList = oNode->GetChildNodes()  
   n = oNodeList->GetLength()  
   for i=0, n-1 do $  
      SAMPLE_RECURSE2, oNodeList->Item(i), indent+3  
   OBJ_DESTROY, oNodeList  
END  
  
PRO sample2  
   oDoc = OBJ_NEW('IDLffXMLDOMDocument')  
   oDoc->Load, FILENAME="sample.xml"  
   SAMPLE_RECURSE2, oDoc, 0  
   OBJ_DESTROY, oDoc  
END  

Please note that document and text nodes do not have node names, so the GetNodeName method always returns `#document' and `#text,' respectively.

  IDL Online Help (March 06, 2007)