/* purpose: demonstrate how to list the element names in document order */

parse arg xmlFileName

   /* create an instance of the JAXP DocumentBuilderFactory    */
factory=bsf.loadClass("javax.xml.parsers.DocumentBuilderFactory")~newInstance
factory~setNamespaceAware(.true)    -- set desired parser to namespace aware
parser=factory~newDocumentBuilder   -- create the parser from the factory

eh=.errorHandler~new       -- create an error handler Rexx object
   -- wrap up the Rexx error handler as a Java object
javaEH=BsfCreateRexxProxy(eh, , "org.xml.sax.ErrorHandler")
parser~setErrorHandler(javaEH)   -- set the error handler for this parser

rootNode=parser~parse(xmlFileName)  -- parse the file, returns root node

   /* make important constants available via .local            */
clzDomNode=bsf.loadClass("org.w3c.dom.Node") -- load the Java interface class
.local~ELEMENT_NODE      =clzDomNode~ELEMENT_NODE        -- save field value

   /* now collect all text and CDATA nodes and display them    */
call followNode rootNode, 0

::requires BSF.CLS      /* get the Java support */

::routine followNode    /* walks the document tree recursively */
  use arg node, level
  call processNode node, level      -- process received node
  if node~hasChildNodes then
  do
     children=node~getChildNodes    -- get NodeList
     loop i=0 to children~length-1  -- 0-based indexes!
        call followNode children~item(i), level+1  -- recurse
     end
  end

::routine processNode   /* processes each node                 */
  use arg node, level
  nodeType=node~getNodeType      -- get type of node
  if nodeType=.element_Node then
     say "   "~copies(level) || pp(node~nodeName)


::class ErrorHandler    -- a Rexx error handler ("org.xml.sax.ErrorHandler")

::method unknown        /* handles "warning", "error" and "fatalError" events */
  use arg methName, argArray  -- arguments from the Java SAX parser
  exception=argArray[1] -- retrieve SAXException argument
  .error~say(methName":" -
             "line="exception~getLineNumber",col="exception~getColumnNumber":" -
             pp(exception~getMessage))