[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
-----------------------------------------------------------------------