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

RE: XML_Parse ended in error



Hi Scott,
Thanks for reply,
I've attached simple program and xml file.


-----Original Message-----
From: ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx
[mailto:ftpapi-bounces@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of Scott Klement
Sent: Wednesday, October 07, 2009 12:40 PM
To: HTTPAPI and FTPAPI Projects
Subject: Re: XML_Parse ended in error

Hello Vlad,

Vladimir Vayntraub wrote:
> It takes a dump on statement 2433 in EXPAT in "C" Module "XMLPARSE.C" on
> character data handling routine. 

In my copy of EXPAT, line 2433 is a comment.  Please don't post a line 
number, that's not useful information.

Instead provide a program -- the simplest possible program -- that 
demonstrates the problem you are having.  This should be a program that 
I can take and run on my computer with a minimum of effort.

I've already tried parsing the XML file you attached to your e-mail, and 
it parsed for me (in HTTPAPI) with absolutely no errors or problems.


> May be there's field size issue.

It's not a field size issue.  I've parsed fields that are megabytes long 
in a single XML element.  Instead of taking random stabs at the problem, 
please provide some real information.  I don't want to play 20 guesses. 
  Show me how to reproduce the problem.
-----------------------------------------------------------------------
This is the FTPAPI mailing list.  To unsubscribe, please go to:
http://www.scottklement.com/mailman/listinfo/ftpapi
-----------------------------------------------------------------------
     H DFTACTGRP(*NO) ACTGRP(*NEW) BNDDIR('QC2LE':'HTTPAPI')
    ?**-------------------------------------------------------------------------
      /copy libhttptst/qrpglesrc,httpapi_h
      /copy libhttptst/qrpglesrc,ifsio_h
      /copy libhttptst/qrpglesrc,errno_h
      /copy libhttptst/qrpglesrc,expat_h
     ?**----------------------------------------------------------------
     d
     d start@          PR
     d   data                          *   value
     D   elem                          *   value
     D   attr                          *   dim(32767) options(*varsize)
     D end             PR
     D   data                          *   value
     D   elem                          *   value
     D chardata        PR
     D   data                          *   value
     D   string                   65535A   const options(*varsize)
     D   len                         10I 0 value

     D QDCXLATE        PR                  extpgm('QDCXLATE')
     D   len                          5P 0 const
     D   data                     32702A   options(*varsize)
     D   table                       10A   const
     D blanks          s            132A

     D Buff            s           8192A
     D PrintMe         s            132A   varying

     D stack           s             50A   varying dim(50)
     D Depth           s             10I 0

     D fd              s             10I 0
     D p               s                   like(XML_Parser)
     D len             s             10I 0
     D done            s             10I 0
     D x               s             10I 0
     d @file_name      s            100a   inz(*blanks)
     d rc              s             10I 0
     d @xml            s           1500a   inz(*blanks)
     d Qs              c                   ''''
     d No#             s              4  0 inz(*zeros)
     d ##X             s              4  0 inz(*zeros)

      /free
    ?    //-----------------------------------------------
                   @file_name = *blanks;
                  @file_name = '/tmp/test.xml';
         //
         //  Open XML document to parse

         fd = open(%trim(@file_name): O_RDONLY);
         if (fd < 0);
            @xml = *blanks;
            return;
         endif;

         //
         // Create a "parser object" in memory that
         // will be used to parse the document.
         //

         p = XML_ParserCreate(*NULL);
         if (p = *NULL);
           callp close(fd);
            @xml = *blanks;
            return;
         endif;

         //
         // Register subprocedures to be called for the
         // starting and ending elements of an XML document
         //

         XML_SetStartElementHandler(p: %paddr(start@));
         XML_SetEndElementHandler(p: %paddr(end));
         XML_SetCharacterDataHandler(p: %paddr(chardata));

         //
         // The following loop will read data from the XML
         // document, and feed it into the XML parser
         //
         // The parser will call the "start" and "end"
         // as the correct data is fed to it, and they'll
         // create the outline.
         //

         dou (done = 1);

             len = read(fd: %addr(Buff): %size(Buff));

             if (len < 1);
                done = 1;
             endif;

             if (XML_Parse(p: Buff: len: done) = XML_STATUS_ERROR);
                 callp close(fd);
            @xml = *blanks;
            return;
             endif;

         enddo;

         //
         // Done parsing... clean up!
         //

         XML_ParserFree(p);
         callp close(fd);
             return;
      /end-free

     P start@          B
     D start@          PI
     D   data                          *   value
     D   elem                          *   value
     D   attr                          *   dim(32767) options(*varsize)

     D elemName        s             50A

      /free

         depth = depth + 1;

         elemName = %str(elem);
         QDCXLATE( %len(%trimr(elemName))
                 : elemName
                 : 'QTCPEBC' );

         stack(depth) = %trimr(elemName);

      /end-free
     P                 E


     P end             B
     D end             PI
     D   data                          *   value
     D   elem                          *   value
      /free
          depth = depth - 1;
      /end-free
     P                 E


     P chardata        B
     D chardata        PI
     D   data                          *   value
     D   string                   65535A   const options(*varsize)
     D   len                         10I 0 value

     D x               s             10I 0
     D val             s            132A
     D newval          s            132A   varying
      /free
         if (len < 1);
            return;
         endif;

         val = %subst(string:1:len);
         QDCXLATE( len
                 : val
                 : 'QTCPEBC' );

         newval = '';
         for x = 1 to len;
            if ( %subst(val:x:1) >= x'40' );
                newval = newval + %subst(val:x:1);
            endif;
         endfor;

         if (%len(newval)<1 or newval = *blanks);
            return;
         endif;

         printme = stack(depth) + '|' + newval;    //-- changed to '|' and it wa
          if @xml <> *blanks;
         @xml = %trim(@xml) + ',' + %trim(printme);
          else;
         @xml = %trim(@xml) + %trim(printme);
          endif;

      /end-free
     P                 E
      /define ERRNO_LOAD_PROCEDURE
      /copy libhttptst/qrpglesrc,errno_h

Attachment: test.xml
Description: application/xml

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