[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: xml-sax issue



   This is a little program I use to check what is coming on to SAX
   Procedure. Just step through it in debug and you can see what is coming
   in.
   ������� ctl-opt Option(*Srcstmt:*NoUnref:*Nodebugio);
   ������ ctl-opt Main(TestExtract);
   ������ dcl-pr TestExtract ExtPgm('TESTEXTRA3') end-pr;
   ������ dcl-ds TD_CommunicationArea Qualified Template;
   �������� TagNameSeen Ind Inz('0');
   �������� FileName VarChar(40);
   �������� FileHandle Int(10);
   ������ end-ds;
   ����� * - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   - - - - -
   ����� * TestExtract
   ����� *�� This function tests XML SAX processing.
   ����� *� Input������ - None.
   ����� *� Out�������� - None.
   ����� *� Returns���� - None.
   ����� * - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   - - - - -
   ������ dcl-proc TestExtract;
   �������� dcl-pi *N end-pi;
   �������� dcl-ds CommunicationArea LikeDs(TD_CommunicationArea)
   Inz(*LikeDs);
   �������� dcl-s OriginalFile VarChar(40);
   �������� dcl-s Options VarChar(126);
   �������� OriginalFile = '/tmp/response01';
   �������� Options = 'doc=file';
   �������� XML-Sax %Handler(CallbackHandler:
   ������������������������� CommunicationArea)
   ���������������� %Xml(OriginalFile:
   ��������������������� Options);
   �������� Return;
   ������ end-proc;
   ����� * - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   - - - - -
   ����� * CallbackHandler
   ����� *�� This function is called by XML-SAX and receives chucks
   of data and tags
   ����� *� Input������ - Communications area. Pass data back
   and forth.
   ����� *��������������� Event number
   ����� *��������������� Pointer to data. This allows
   any amount of data
   ����� *��������������� Length of data.
   ����� *��������������� Kind of exception seen.
   ����� *� Out�������� - None.
   ����� *� Returns���� - Whether to shut down the process.
   ����� * - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   - - - - -
   ������ dcl-proc CallbackHandler;
   �������� dcl-pi *N Int(10);
   ���������� InOutCommunicationArea
   LikeDs(TD_CommunicationArea);
   ���������� InEvent Int(10) Value;
   ���������� InPointerToData Pointer Value;
   ���������� InDataLength Int(20) Value;
   ���������� InExceptionId Int(10) Value;
   �������� end-pi;
   �������� dcl-s Data Char(65535) Based(InPointerToData);
   �������� dcl-s DataActual VarChar(1024);
   �������� dcl-s Count Int(10);
   �������� // All the events that can be monitored. Normally you
   would
   �������� //�� use *XML_START_ELEMENT, *XML_CHARS and
   *XML_END_ELEMENT.
   �������� Select;
   ���������� When InEvent = *XML_START_ELEMENT;
   ������������ Count += 1;
   ���������� When InEvent = *XML_CHARS;
   ������������ Count += 1;
   ���������� When InEvent = *XML_END_ELEMENT;
   ������������ Count += 1;
   ���������� When InEvent = *XML_START_DOCUMENT;
   ������������ Count += 1;
   ���������� When InEvent = *XML_VERSION_INFO;
   ������������ Count += 1;
   ���������� When InEvent = *XML_ENCODING_DECL;
   ������������ Count += 1;
   ���������� When InEvent = *XML_STANDALONE_DECL;
   ������������ Count += 1;
   ���������� When InEvent = *XML_DOCTYPE_DECL;
   ������������ Count += 1;
   ���������� When InEvent = *XML_PREDEF_REF;
   ������������ Count += 1;
   ���������� When InEvent = *XML_UCS2_REF;
   ������������ Count += 1;
   ���������� When InEvent = *XML_UNKNOWN_REF;
   ������������ Count += 1;
   ���������� When InEvent = *XML_ATTR_NAME;
   ������������ Count += 1;
   ���������� When InEvent = *XML_ATTR_CHARS;
   ������������ Count += 1;
   ���������� When InEvent = *XML_ATTR_PREDEF_REF;
   ������������ Count += 1;
   ���������� When InEvent = *XML_ATTR_UCS2_REF;
   ������������ Count += 1;
   ���������� When InEvent = *XML_UNKNOWN_ATTR_REF;
   ������������ Count += 1;
   ���������� When InEvent = *XML_END_ATTR;
   ������������ Count += 1;
   ���������� When InEvent = *XML_PI_TARGET;
   ������������ Count += 1;
   ���������� When InEvent = *XML_PI_DATA;
   ������������ Count += 1;
   ���������� When InEvent = *XML_START_CDATA;
   ������������ Count += 1;
   ���������� When InEvent = *XML_END_CDATA;
   ������������ Count += 1;
   ���������� When InEvent = *XML_COMMENT;
   ������������ Count += 1;
   ���������� When InEvent = *XML_EXCEPTION;
   ������������ Count += 1;
   ���������� When InEvent = *XML_END_DOCUMENT;
   ������������ Count += 1;
   �������� EndSl;
   �������� If InDataLength > 0;
   ���������� DataActual = %Subst(Data:1:InDataLength);
   �������� EndIf;
   �������� Return 0;
   ������ end-proc;
   On Sat, Sep 5, 2015 at 12:59 AM, Scott Klement <[1]sk@xxxxxxxxxxxxxxxx>
   wrote:

     Dutch,
     You are doing this:
     xml = %trim(%subSt(GetResponse:3:5000));
     Can you explain why you are doing that %subst?� Wouldn't that cause
     the '<M' at the start of the XML document to be chopped off, making
     this an invalid document?
     The %trim() is not necessary, but shouldn't hurt anything.
     Can you explain why you want to use XML-SAX here instead of XML-INTO
     or the XML parser included with HTTPAPI?� (Which is a wrapper
     around Expat)
     On 9/4/2015 4:34 PM, RPG List wrote:

     Scott,
     I'm not sure we don't have another problem.� Here's why when I step
     through the xmlhandler, I get the start_document on the first read,
     and
     then I get end_document on the second read.� That's it.� Its
     almost as
     though its never seeing the data further.� I ran a test using the
     following:
     XML = '<xmlTest>+
     � � � � � � � � <name type="author">AS400 Sample Code/name>+
     � � � � � � � � </xmlTest>';
     that worked.
     Here is what the xml document looks like coming in:
     '<MMMProcess><Results><Claim>8104550</Claim><Amount>1995.83</'
     'Amount><Code>7320</Code><Xrg>53</Xrg><MEANLOS2>2</MEAN'
     'LOS2><Error_Code>0</Error_Code></Results></MMMProcess>'
     I just can't find what's wrong with the xml..

     Dutch,
     The XML processing instructions ("header" as you call it) are
     optional.
     They are not required.
     The problem is what I said in my first reply to you.� Please read
     the
     article I linked to so you can learn how XML-SAX works.
     -SK
     On 9/4/2015 3:18 PM, RPG List wrote:

     one additional issue I saw this morning Scott and maybe this is the
     problem, the incoming XML does not have what I would call a standard
     header:
     IE: it does not have a version or description that I see in most xml
     documents, maybe that's needed or maybe not?

     Dutch,
     This looks an awful lot like a program that I wrote a long time ago
     to
     print the XML events.� I would not recommend using this to actually
     parse a document -- to parse with XML-SAX you're going to need to
     create
     a stack of XML elements (implemented in RPG as an array, most
     likely)
     and keep track of the current XML element you're working on, etc.
     There
     was another program included in that same article called "CustXml"
     that
     demonstrates this -- that program would be a better starting point.
     [2]http://iprodeveloper.com/print/rpg-programming/rpgs-xml-sax-opcod
     e
     (use the "print" option to format the code better, Penton media has
     screwed up the code figures in their article archive)
     Based on what you've shown us, the only thing you'd get in your
     string
     is the name of the XML tag you're parsing.� (Since that's what's
     pointed
     to by "string" during the XML_START_ELEMENT event.)
     You say you're getting nothing at all...?� Since you're getting it
     from
     the 'value' field, you'd need to show us the definition and/or code
     that
     populates 'value' for us to see how that works.� Funny that you
     omitted
     that part of the code considering that your question is about it?
     Also, is this part of a program that uses HTTPAPI or FTPAPI?� If
     so, I
     guess we can discuss it here...� �if not, however, this really
     doesn't
     belong on this mailing list.
     -SK
     On 9/3/2015 9:17 PM, RPG List wrote:

     I am attempting to parse out the data I'm getting from a web service
     and
     I'm having a little trouble.
     I'm using the following as my to the handler:
     � � � xml = %trim(%subSt(GetResponse:3:5000));
     � � � xml-sax %handler(xmlHandler: ignoreMe)
     � � � � �%XML(xml: 'doc=string');
     GetResponse has the full xml string I'm expecting.
     my xmlhandler is defined as follows:
     P xmlHandler� � � b
     D� � � � � � � � �pi� � � � � � 10i 0
     D ignore� � � � � � � � � � � � �1a
     D event� � � � � � � � � � � � �10i 0 value
     D� �string� � � � � � � � � � � � *� �value
     D� �stringLen� � � � � � � � � �20i 0 value
     D� �exceptionId� � � � � � � � �10i 0 value
     I then have the following code in the procedure:
     OutputXML.name = XML_Event_Name(event);
     OutputXML.data = *blanks;
     select;
     when string=*null or stringlen<1;
     � � � // no string given...
     when stringlen>%size(value);
     � � � OutputXML.data = '** string length invalid';
     other;
     � � � OutputXML.data = %subst(value:1:stringlen);
     endsl;
     // Change Current XML group if applicable
     Select;
     � � � When OutputXML.name = 'XML_START_ELEMENT';
     The problem is outputXML.data never has a value that I can see.� Am
     I
     doing something wrong or am I missing a step?

     --------------------------------------------------------------------
     ---
     This is the FTPAPI mailing list.� To unsubscribe, please go to:
     [3]http://www.scottklement.com/mailman/listinfo/ftpapi
     --------------------------------------------------------------------
     ---

References

   1. mailto:sk@xxxxxxxxxxxxxxxx
   2. http://iprodeveloper.com/print/rpg-programming/rpgs-xml-sax-opcode
   3. http://www.scottklement.com/mailman/listinfo/ftpapi
-----------------------------------------------------------------------
This is the FTPAPI mailing list.  To unsubscribe, please go to:
http://www.scottklement.com/mailman/listinfo/ftpapi
-----------------------------------------------------------------------