Poproszę Was jeszcze jednak o pomoc. Utkwiłem dalej. Aktualnie dane odbieram ale pojawia się wspomniany błąd (po pobraniu danych): EDOMParsError with message 'Nieprawidłowa wartość na najwyższym poziomie dokumentu'
Co i jak:
Wysyłana koperta SOAP:
<?xml version="1.0" encoding="UTF-8"?>
Odpowiedź. Dane odbieram w postaci (< > ...):
<s:Envelope xmlns:s="
http://www.w3.org/2003/05/soap-envelope" xmlns:a="
http://www.w3.org/2005/08/addressing"><s:Header><a:Action s:mustUnderstand="1">
http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/DaneSzukajResponse</a:Action></s:Header><s:Body><DaneSzukajResponse xmlns="
http://CIS/BIR/PUBL/2014/07"><DaneSzukajResult><root>
<dane>
<Regon>05002589200000</Regon>
<RegonLink>&lt;a href='javascript:danePobierzPelnyRaport("05002589200000","DaneRaportPrawnaPubl", 0);'&gt;050025892&lt;/a&gt;</RegonLink>
<Nazwa>MPO SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ</Nazwa>
<Wojewodztwo>PODLASKIE</Wojewodztwo>
<Powiat>m. Białystok</Powiat>
<Gmina>M. Białystok</Gmina>
<Miejscowosc>Białystok</Miejscowosc>
<KodPocztowy>15-950</KodPocztowy>
<Ulica>ul. Test-Krucza</Ulica>
<Typ>P</Typ>
<SilosID>6</SilosID>
</dane>
</root></DaneSzukajResult></DaneSzukajResponse></s:Body></s:Envelope>
I otrzymuje błąd j.w. Więc podmieniam Response w HTTPRIO1AfterExecute:
procedure TForm1.HTTPRIO1AfterExecute(const MethodName: string;
SOAPResponse: TStream);
var sl: tstringlist;
data:string;
begin
if operacja='DaneSzukaj' then
begin
//showmessage('tu');
Memo1.Lines.Add(' ______________________________________');
Memo1.Lines.Add('Resopnse: '+MethodName);
sl:=TStringList.Create;
SOAPResponse.Position:=0;
with TStringStream.Create('') do
try
CopyFrom(SOAPResponse, SOAPResponse.Size - SOAPResponse.Position);
data:= DataString;
Data:=StringReplace(Data,'&','&',[RfReplaceAll]);
Data:=StringReplace(Data,'<','<',[RfReplaceAll]);
Data:=StringReplace(Data,'>','>',[RfReplaceAll]);
Data:=StringReplace(Data,'
','',[RfReplaceAll]);
// Data:=StringReplace(Data,'<DaneSzukajResult>','<DaneSzukajResult><![CDATA[',[RfReplaceAll]);
// Data:=StringReplace(Data,'</root>','</root>]]>',[RfReplaceAll]);
sl.Add(data);
SOAPResponse.Size := 0;
SOAPResponse.Position := 0;
sl.SaveToStream(SOAPResponse);
Data:=UTF8ToWideString(Data);
Memo1.Lines.Add(data);
finally
Free;
end;
end;
Oczywiście wtedy odpowiedź jest czytelniejsza (+UTF8ToWideString):
<s:Envelope xmlns:s="
http://www.w3.org/2003/05/soap-envelope" xmlns:a="
http://www.w3.org/2005/08/addressing"><s:Header><a:Action s:mustUnderstand="1">
http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/DaneSzukajResponse</a:Action></s:Header><s:Body><DaneSzukajResponse xmlns="
http://CIS/BIR/PUBL/2014/07"><DaneSzukajResult><root>
<dane>
<Regon>05002589200000</Regon>
<RegonLink><a href='javascript:danePobierzPelnyRaport("05002589200000","DaneRaportPrawnaPubl", 0);'>050025892</a></RegonLink>
<Nazwa>MPO SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ</Nazwa>
<Wojewodztwo>PODLASKIE</Wojewodztwo>
<Powiat>m. Białystok</Powiat>
<Gmina>M. Białystok</Gmina>
<Miejscowosc>Białystok</Miejscowosc>
<KodPocztowy>15-950</KodPocztowy>
<Ulica>ul. Test-Krucza</Ulica>
<Typ>P</Typ>
<SilosID>6</SilosID>
</dane>
</root></DaneSzukajResult></DaneSzukajResponse></s:Body></s:Envelope>
jednak błąd nadal się pojawia. Dodawałem więc znaczniki CDATA: Mimo to, ciągle to samo:
EDOMParsError:
Line: 215 </root>]]></DaneSzukajResult></DaneSzuka'. (tak, brak j>)
Debuger zatrzymuje program w Xml.XMLDoc w procedurze LoadData w tym miejscu:
if not Status then
begin
DocSource := xdsNone;
ParseError := DOMDocument as IDOMParseError;
Msg := Format('%s%s%s: %d%s%s', [ParseError.Reason, SLineBreak, SLine,
ParseError.Line, SLineBreak, Copy(ParseError.SrcText, 1, 40)]);
> raise EDOMParseError.Create(ParseError, Msg);
end;
Przeglądałem Unofficial SOAP Bug Fixes, ale prócz poprawki ActivateDSL z SOAP.WSDLNode.pas niczego nie znalazłem.
Odpowiedź z danymi z ws, po dokonaniu zamian w responsie (<...) wygląda identycznie, jak ta, którą otrzymuję w SoapUI.
Pracuje na wersjii Berlin.
Może macie dla mnie jakieś sugestie?
Czy owy problem ze znacznikami cdata/< da się rozwiązać zgrabniej?
Jest też problem z kodowaniem. Dane które wracają się krzaczą dopóki nie wykonam konwersji UTF8ToWideString (może to jakaś wskazówka).
Dzięki za pomoc ....
- kali