/* 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

   /* get constant value to determine node types to filter     */
whatToShow=bsf.getConstant("org.w3c.dom.traversal.NodeFilter", "SHOW_ELEMENT")

   /* create a NodeIterator with only Element nodes            */
iterator=rootNode~createNodeIterator(rootNode, whatToShow, .nil, .true)

   /* process list of Element nodes                            */
node=iterator~nextNode  /* get first node                      */
loop while node<>.nil
   nrAttrs=node~getAttributes~getLength   /* get nr of attributes */
   say pp(node~getNodeName)
   node=iterator~nextNode  /* get next node                    */
end

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

::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))