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