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

SV: XML Parse failed at line 38, col 2: mismatch tag



Sender: "Helge Bichel" <hbi@xxxxxxx>

Dear Peter and Scott.

I am trying getting your example to work as well as example18 from LIBHTTP.

Peter's (corrected) example gives me: HTTP/1.1 302 Moved Temporarily   
Scott's example18 gives me            HTTP/1.1 500 Internal Server Error.

Most other examples from LIBHTTP work.

Can anybody explain ?

Best regards

Helge Bichel


   

-----Oprindelig meddelelse-----
Fra: owner-ftpapi@xxxxxxxxxxxxx [mailto:owner-ftpapi@xxxxxxxxxxxxx]Pa
vegne af Hoey, Peter
Sendt: 24. juni 2006 14:42
Til: ftpapi@xxxxxxxxxxxxx
Emne: RE: XML Parse failed at line 38, col 2: mismatch tag 


Sender: "Hoey, Peter" <PHoey@xxxxxxxx>

Hi Scott,

	Thanks for your help, the code works fine. The formatting of the
SOAP request is quite different than the one in EXAMPLE18 that calls the
Currency Exchange Rate Web service provided by WEBSERVICEX.net. 
	I stumbled across the Federal Reserve Bank of NY website and saw
that they were also providing a Web Service for the currency exchange
rates. Thank you for explaining the issues of the Bank's Web Service
returning an embedded XML document as opposed to a field containing the
exchange rate. Thanks again for your extra time and effort.  

	I think the HTTPAPI library is a great tool and I hope to find
more applications to utilize it.        

Regards,
 Peter W. Hoey



-----Original Message-----
From: owner-ftpapi@xxxxxxxxxxxxx [mailto:owner-ftpapi@xxxxxxxxxxxxx] On
Behalf Of Scott Klement
Sent: Friday, June 23, 2006 3:40 PM
To: ftpapi@xxxxxxxxxxxxx
Subject: Re: XML Parse failed at line 38, col 2: mismatch tag 

Sender: Scott Klement <sk@xxxxxxxxxxxxxxxx>


Hi Peter,

The SOAP request in the message you posted doesn't match the WDSL
document 
that you reference.  Also, the URL you included in your code isn't the
one 
listed in the WSDL document -- so I'm not sure where you got these from?

At any rate, what appears to be happening in your code is that you're 
getting back an HTML document that tells you that the URL you provided 
doesn't exist.  Then, HTTPAPI's XML parser is trying to parse that HTML 
document as if it were XML, and that's why you get the XML Parse error.

I've modified your program to use the SOAP request the way the WDSL 
document specifies it. There are still some problems, and I'll say more 
about that in a minute, but here's the code:

      H DFTACTGRP(*NO) BNDDIR('HTTPAPI':'QC2LE')

      D ExchRateX       PR                  ExtPgm('EXCHRATEX')
      D  Country1                      3A   const

      D ExchRateX       PI
      D  Country1                      3A   const

       /copy httpapi_h

      D Incoming        PR
      D   rate                     32767A   varying
      D   depth                       10I 0 value
      D   name                      1024A   varying const
      D   path                     24576A   varying const
      D   value                    32767A   varying const
      D   attrs                         *   dim(32767)
      D                                     const options(*varsize)

      D Soap            s          32767A   varying
      D rc              s             10I 0
      D rate            s          32767A   varying

       /free

          http_debug(*ON);
          rate='';

         SOAP =
          '<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>'
         +'<SOAP-ENV:Envelope'
         +'
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/";'
         +'    xmlns:xsd="http://www.w3.org/2001/XMLSchema";'
         +'    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; >'
         +'<SOAP-ENV:Body>'
         +'  <mns:getLatestNoonRate'
         +'       xmlns:mns="http://v1_0.WebService.fxrates.markets";'
         +'       SOAP-ENV:encodingStyle='
         +              '"http://schemas.xmlsoap.org/soap/encoding/";>'
         +'    <currency_code xsi:type="xsd:string">'
         +         %trim(Country1)
         +    '</currency_code>'
         +'  </mns:getLatestNoonRate>'
         +'</SOAP-ENV:Body>'
         +'</SOAP-ENV:Envelope>';

         rc = http_url_post_xml(

'http://www.newyorkfed.org/markets/fxrates/WebService/v1_0/FXWS.cfc'
                         : %addr(SOAP) + 2
                         : %len(SOAP)
                         : *NULL
                         : %paddr(Incoming)
                         : %addr(rate)
                         : HTTP_TIMEOUT
                         : HTTP_USERAGENT
                         : 'text/xml'
                         : *blanks );


        if (rc <> 1);
           http_crash();
        else;
           http_comp(%trim(Country1) + ' ' + Rate);
        endif;

        *inlr = *on;

       /end-free



      P Incoming        B
      D Incoming        PI
      D   rate                     32767A   varying
      D   depth                       10I 0 value
      D   name                      1024A   varying const
      D   path                     24576A   varying const
      D   value                    32767A   varying const
      D   attrs                         *   dim(32767)
      D                                     const options(*varsize)

      D atof            PR            12A   extproc('atof')
      D   string                        *   value options(*string)

       /free

           if (name = 'ns1:getLatestNoonRateReturn');
              rate += value;
           endif;

       /end-free
      P                 E

This code works, sort of.  The problem is, this Web Service doesn't
return 
a field containing an exchange rate.  Instead, it embeds yet another XML

document inside the SOAP message that it returns.

So, when the http_url_post_xml() routine is complete, you'll have an XML

document in the "Rate" variable instead of an actual rate.  You'd then 
have to feed "Rate" into an XML parser to actually get the exchange rate

from it!

To get a better idea of what I'm talking about, replace the 
http_url_post_xml() with the following call to HTTPAPI:

         rc = http_url_post(

'http://www.newyorkfed.org/markets/fxrates/WebService/v1_0/FXWS.cfc'
                         : %addr(SOAP) + 2
                         : %len(SOAP)
                         : '/tmp/nyfed.xml'
                         : HTTP_TIMEOUT
                         : HTTP_USERAGENT
                         : 'text/xml'
                         : *blanks );

What this does is download the response from the web server and store it

into a file (as opposed to parsing the XML and returning each element 
individually).

As you'll see if you examine that nyfed.xml file, there's an XML
document 
inside another XML document!  The data stored inside the 
<getLatestNoonRateReturn> XML element is actually another document, with

all of it's XML tags escaped so that the XML parser will tread it as
data 
instead of treating it as additional XML tags.

So you'd have to save that data to a file as an XML document, and parse 
that "document-within-a-document" again to get the actual elements. 
Though, you could also "cheat" and use %SCAN/%SUBST to get the actual
rate 
from the inner document.  For example:

      H DFTACTGRP(*NO) BNDDIR('HTTPAPI':'QC2LE')

      D ExchRateX       PR                  ExtPgm('EXCHRATEX')
      D  Country1                      3A   const

      D ExchRateX       PI
      D  Country1                      3A   const

       /copy httpapi_h

      D Incoming        PR
      D   rate                     32767A   varying
      D   depth                       10I 0 value
      D   name                      1024A   varying const
      D   path                     24576A   varying const
      D   value                    32767A   varying const
      D   attrs                         *   dim(32767)
      D                                     const options(*varsize)

      D Soap            s          32767A   varying
      D rc              s             10I 0
      D rate            s          32767A   varying
      D pos             s             10I 0
      D len             s             10I 0

       /free

          http_debug(*ON);
          rate='';

         SOAP =
          '<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>'
         +'<SOAP-ENV:Envelope'
         +'
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/";'
         +'    xmlns:xsd="http://www.w3.org/2001/XMLSchema";'
         +'    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; >'
         +'<SOAP-ENV:Body>'
         +'  <mns:getLatestNoonRate'
         +'       xmlns:mns="http://v1_0.WebService.fxrates.markets";'
         +'       SOAP-ENV:encodingStyle='
         +              '"http://schemas.xmlsoap.org/soap/encoding/";>'
         +'    <currency_code xsi:type="xsd:string">'
         +         %trim(Country1)
         +    '</currency_code>'
         +'  </mns:getLatestNoonRate>'
         +'</SOAP-ENV:Body>'
         +'</SOAP-ENV:Envelope>';

       /undefine DEBUG
       /if defined(DEBUG)
         rc = http_url_post(

'http://www.newyorkfed.org/markets/fxrates/WebService/v1_0/FXWS.cfc'
                         : %addr(SOAP) + 2
                         : %len(SOAP)
                         : '/tmp/nysetest.xml'
                         : HTTP_TIMEOUT
                         : HTTP_USERAGENT
                         : 'text/xml'
                         : *blanks );

       /else
         rc = http_url_post_xml(

'http://www.newyorkfed.org/markets/fxrates/WebService/v1_0/FXWS.cfc'
                         : %addr(SOAP) + 2
                         : %len(SOAP)
                         : *NULL
                         : %paddr(Incoming)
                         : %addr(rate)
                         : HTTP_TIMEOUT
                         : HTTP_USERAGENT
                         : 'text/xml'
                         : *blanks );
       /endif



        if (rc <> 1);
           http_crash();
        endif;

        pos = %scan('<frbny:OBS_VALUE>': Rate);
        if (pos > 0);
           pos = %scan('>': Rate: Pos) + 1;
           len = %scan('</frbny:OBS_VALUE': Rate: Pos) - pos;
        endif;
        if (pos>1 and len>0);
           Rate = %subst(Rate: pos: len);
           http_comp(%trim(Country1) + ' ' + Rate);
        endif;

        *inlr = *on;

       /end-free



      P Incoming        B
      D Incoming        PI
      D   rate                     32767A   varying
      D   depth                       10I 0 value
      D   name                      1024A   varying const
      D   path                     24576A   varying const
      D   value                    32767A   varying const
      D   attrs                         *   dim(32767)
      D                                     const options(*varsize)

      D atof            PR            12A   extproc('atof')
      D   string                        *   value options(*string)

       /free

           if (name = 'ns1:getLatestNoonRateReturn');
              rate += value;
           endif;

       /end-free
      P                 E

Hope that helps...

---
Scott Klement  http://www.scottklement.com

On Thu, 22 Jun 2006, Hoey, Peter wrote:

> Hello,
>
>
>
>            I am trying to utilize the new exchange rate Web Service
> offered by the Federal Reserve Bank of New York
>
> (see http://www.ny.frb.org/markets/pilotfx.html ). I was hoping to use
> the HTTP API's to retrieve the exchange rate. There is a link on the
web
> site that will provide the Web Service Definition. There is a lot of
> wsdl code that they show. I tried to extract what I needed for the
SOAP
> message that the HTTP API's need. I believe the exchange rate that is
> returned is a string variable as opposed to the floating point
variable
> that are returned in some of your examples.  Thanks in advance for any
> help.
>
> .
>
> Here is the code that I wrote:
>
>
>
> H DFTACTGRP(*NO) BNDDIR('HTTPAPI':'QC2LE')
>
>
>
> D ExchRateX       PR                  ExtPgm('EXCHRATEX')
>
> D  Country1                      3A   const
>
>
>
> D ExchRateX       PI
>
> D  Country1                      3A   const
>
>
>
> /copy httpapi_h
>
>
>
> D Incoming        PR
>
> D   rate                        12A
>
> D   depth                       10I 0 value
>
> D   name                      1024A   varying const
>
> D   path                     24576A   varying const
>
> D   value                    32767A   varying const
>
> D   attrs                         *   dim(32767)
>
> D                                     const options(*varsize)
>
>
>
> D Soap            s          32767A   varying
>
> D rc              s             10I 0
>
> D rate            s             12A
>
>
>
> /free
>
> SOAP =
>
>  '<?xml version="1.0" encoding="US-ASCII" standalone="no"?>'
>
> +'<SOAP-ENV:Envelope'
>
> +' xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/";'
>
> +' xmlns:tns="http://www.newyorkfed.org./markets/fxrates/WebService/";
>
> +'<SOAP-ENV:Body>'
>
> +'  <tns:getLatestNoonRateRequest>'
>
> +'      <tns:currency_code>'+ %trim(Country1) +'</tns:currency_code>'
>
> +'  </tns:getLatestNoonRateRequest>'
>
> +'</SOAP-ENV:Body>'
>
> +'</SOAP-ENV:Envelope>';
>
>
>
> rc = http_url_post_xml(
>
> 'http://www.newyorkfed.org./markets/fxrates/WebService/v1_0/FXWS'
>
>                   : %addr(SOAP) + 2
>
>                   : %len(SOAP)
>
>                   : *NULL
>
>                   : %paddr(Incoming)
>
>                   : %addr(rate)
>
>                   : HTTP_TIMEOUT
>
>                    : HTTP_USERAGENT
>
>                    : 'text/xml'
>
>                    : *blanks );
>
>
>
>  if (rc <> 1);
>
>     http_crash();
>
>  else;
>
>     http_comp(%trim(Country1) + ' ' + Rate);
>
>  endif;
>
>
>
>  *inlr = *on;
>
>
>
> /end-free
>
>
>
> P Incoming        B
>
> D Incoming        PI
>
> D   rate                        12A
>
> D   depth                       10I 0 value
>
> D   name                      1024A   varying const
>
> D   path                     24576A   varying const
>
> D   value                    32767A   varying const
>
> D   attrs                         *   dim(32767)
>
> D                                     const options(*varsize)
>
>
>
> D atof            PR            12A   extproc('atof')
>
> D   string                        *   value options(*string)
>
>
>
> /free
>
>     if (name = 'getLatestNoonRateReturn');
>
>        rate = atof(value);
>
>     endif;
>
> /end-free
>
> P                 E
>
>
>
>
>
>
> Regards,
>
> Peter W. Hoey
>
>
>
>
>
>
-----------------------------------------------------------------------
This is the FTPAPI mailing list.  To unsubsribe from the list send mail
to majordomo@xxxxxxxxxxxxx with the body: unsubscribe ftpapi mymailaddr
-----------------------------------------------------------------------

-----------------------------------------------------------------------
This is the FTPAPI mailing list.  To unsubsribe from the list send mail
to majordomo@xxxxxxxxxxxxx with the body: unsubscribe ftpapi mymailaddr
-----------------------------------------------------------------------


-----------------------------------------------------------------------
This is the FTPAPI mailing list.  To unsubsribe from the list send mail
to majordomo@xxxxxxxxxxxxx with the body: unsubscribe ftpapi mymailaddr
-----------------------------------------------------------------------