* Data structure used as a parameter between * the XML-SAX operation and the handling * procedure. * - "attrName" is set by the procedure doing the * XML-SAX operation and used by the handling procedure * - "attrValue" is set by the handling procedure * and used by the procedure doing the XML-SAX * operation * - "haveAttr" is used internally by the handling * procedure H/COPY QCPYSRC,HSPECLE HDEBUG(*XMLSAX) Fqsysprt o f 132 printer Fprint o f 132 printer D qsysprtDs DS 132 D Printds DS 132 D XmlEvnts DS Qualified Inz D EventId 10I 0 Dim(25) Overlay(Xmlevnts:*Next) D Event 30A Dim(25) Overlay(Xmlevnts:*Next) D EventId# 10I 0 Dim(25) Overlay(Xmlevnts:*Next) D Element# S 10I 0 D Idx S 10I 0 D Idx2 S 10I 0 D/COPY QCPYSRC,Dspgminf4 D xmlRc 10I 0 OVERLAY(PGMINF:368) D info DS INZ D attrName 20A VARYING D haveAttr N D attrValue 20A VARYING * Prototype for procedure "myHandler" defining * the communication-area parameter as being * like data structure "info" D myHandler PR 10I 0 D commArea LIKEDS(info) D event 10I 0 VALUE D string * VALUE D stringLen 20I 0 VALUE D exceptionId 10I 0 VALUE D Xmldoc S 265A VARYING D Inpdoc S 57A C *Entry Plist C Parm Inpdoc /free Xmldoc = %Trim(Inpdoc); // Start SAX processing. The procedure "myHandler" // will be called for every SAX event; the first // parameter will be the data structure "info". xml-sax(e) %handler(myHandler : info) %xml(xmldoc :'doc=file'); // The XML-SAX operation is complete. The // communication area can be checked to get the // value of the attribute. if not %error() and attrValue <> ''; dsply (attrName + '=' + attrValue); endif; For Idx2 = 1 To Idx By 1; QsysprtDS = 'XML Event: ' +XmlEvnts.Event(Idx2) +' = ' +%Editc(XmlEvnts.EventId(Idx2):'3') +' Count:' +%Editc(XmlEvnts.EventID#(Idx2) :'3') ; write qsysprt qsysprtDs; Endfor; *Inlr = *On; Return; /End-Free // The SAX handling procedure "myHandler" P myHandler B D PI 10I 0 D comm LIKEDS(info) D event 10I 0 VALUE D string * VALUE D stringLen 20I 0 VALUE D exceptionId 10I 0 VALUE D value S 65535A BASED(string) D ucs2value S 16383C BASED(string) D rc S 10I 0 INZ(0) D ParentEvt S Like(Event) static /free Element# += 1; Idx2 = %Lookup(Event :XmlEvnts.EventId); If Idx2 > 0; XmlEvnts.EventId#(Idx2) += 1; Else; Idx += 1; XmlEvnts.EventId(Idx) = Event; XmlEvnts.EventId#(Idx) += 1; Idx2 = Idx; Endif; select; // when event = *XML_START_DOCUMENT; XmlEvnts.Event(Idx2) = '*XML_START_DOCUMENT'; when event = *XML_VERSION_INFO; XmlEvnts.Event(Idx2) = '*XML_VERSION_INFO'; when event = *XML_ENCODING_DECL; XmlEvnts.Event(Idx2) = '*XML_ENCODING_DECL'; when event = *XML_STANDALONE_DECL; XmlEvnts.Event(Idx2) = '*XML_STANDALONE_DECL'; when event = *XML_DOCTYPE_DECL; XmlEvnts.Event(Idx2) = '*XML_DOCTYPE_DECL'; // when event = *XML_START_ELEMENT; XmlEvnts.Event(Idx2) = '*XML_START_ELEMENT'; ParentEvt = Event; when event = *XML_CHARS; XmlEvnts.Event(Idx2) = '*XML_CHARS(ELEMENT) ['+%char(parentevt)+']'; when event = *XML_PREDEF_REF; XmlEvnts.Event(Idx2) = '*XML_PREDEF_REF'; when event = *XML_UCS2_REF; XmlEvnts.Event(Idx2) = '*XML_UCS2_REF'; when event = *XML_UNKNOWN_REF; XmlEvnts.Event(Idx2) = '*XML_UNKNOWN_REF'; when event = *XML_END_ELEMENT; XmlEvnts.Event(Idx2) = '*XML_END_ELEMENT'; ParentEvt = Event; // when event = *XML_ATTR_NAME; XmlEvnts.Event(Idx2) = '*XML_ATTR_NAME'; when event = *XML_ATTR_CHARS; XmlEvnts.Event(Idx2) = '*XML_ATTR_CHARS'; when event = *XML_ATTR_PREDEF_REF; XmlEvnts.Event(Idx2) = '*XML_ATTR_PREDEF_REF'; when event = *XML_ATTR_UCS2_REF; XmlEvnts.Event(Idx2) = '*XML_ATTR_UCS2_REF'; when event = *XML_UNKNOWN_ATTR_REF; XmlEvnts.Event(Idx2) = '*XML_UNKNOWN_ATTR_REF'; when event = *XML_END_ATTR; XmlEvnts.Event(Idx2) = '*XML_END_ATTR'; // when event = *XML_PI_TARGET; XmlEvnts.Event(Idx2) = '*XML_PI_TARGET'; when event = *XML_PI_DATA; XmlEvnts.Event(Idx2) = '*XML_PI_DATA'; // when event = *XML_START_CDATA; XmlEvnts.Event(Idx2) = '*XML_START_CDATA'; ParentEvt = Event; when event = *XML_END_CDATA; XmlEvnts.Event(Idx2) = '*XML_END_CDATA'; ParentEvt = Event; // when event = *XML_COMMENT; XmlEvnts.Event(Idx2) = '*XML_COMMENT'; when event = *XML_EXCEPTION; XmlEvnts.Event(Idx2) = '*XML_EXCEPTION'; PrintDs = 'Parsed to position:' +%Char(Stringlen) +' ExceptID:' +%Char(exceptionId); write print PrintDs; when event = *XML_END_DOCUMENT; XmlEvnts.Event(Idx2) = '*XML_END_DOCUMENT'; endsl; PrintDs = XmlEvnts.Event(Idx2) +' = ' +%Editc(XmlEvnts.EventId(Idx2):'3') ; If Stringlen > 0; PrintDs = %Trimr(PrintDs)+ ' :: ' +%Subst(Value :1 :Stringlen) ; Endif; write print PrintDs; return rc; /end-free P E