XML - dobranie się do błędu

0

Jest sobie taki XML jako treść odpowiedzi w komunikacji SOAP:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
	<soap:Body>
		<soap:Fault>
			<faultcode>soap:Server</faultcode>
			<faultstring>Napotkano błędy podczas.</faultstring>
			<detail>
				<ns2:transportOrderFaultList xmlns:ns2="http://api.../TransportOrders/">
					<transportOrderFaultRow>
						<errorCode>1201</errorCode>
						<errorMessage>Brak w rejestrze klienta o numerze 2778704</errorMessage>
					</transportOrderFaultRow>
						<transportOrderFaultRow>
						<errorCode>1213</errorCode>
					<errorMessage>Niepoprawny numer NIP klienta 1143767</errorMessage>
					</transportOrderFaultRow>
						<transportOrderFaultRow>
						<errorCode>1405</errorCode>
					<errorMessage>Dany typ opakowania jest niewłaściwy dla paczek </errorMessage>
					</transportOrderFaultRow>
				</ns2:transportOrderFaultList>
			</detail>
		</soap:Fault>
	</soap:Body>
</soap:Envelope>

Delphi ładnie wywołuje exceptiona, ale tylko klasy ERemotableException. Co prawda wsdl opisuje typ transportOrderFaultList, ale taki typ nie jest zwracany, bo to tylko zawartość ogólnego błędu. Jak się do tego dobrać, jak rozpoznać typ i przypisać do obiektów utworzonych generatorem z WSDL bez zabawy w ręczne przetwarzanie XMLa?

0

Ale że co ty chcesz zrobić?

0

@woolfik: Wczytać do obiektu

  TransportOrderFaultRow = class(TRemotable)
  private
    FerrorCode: Integer;
    FerrorMessage: string;
  published
    property errorCode:    Integer  Index (IS_UNQL) read FerrorCode write FerrorCode;
    property errorMessage: string   Index (IS_UNQL) read FerrorMessage write FerrorMessage;
  end;
  TransportOrderFaultList2 = array of TransportOrderFaultRow;
  transportOrderFaultList =  type TransportOrderFaultList2;
  ...
initialization  
  RemClassRegistry.RegisterXSInfo(TypeInfo(TransportOrderFaultList2), 'http://api.../TransportOrders/', 'TransportOrderFaultList2', 'TransportOrderFaultList');
  RemClassRegistry.RegisterXSInfo(TypeInfo(transportOrderFaultList), 'http://api.../TransportOrders/', 'transportOrderFaultList');
  RemClassRegistry.RegisterXSClass(TransportOrderFaultRow, 'http://api.../TransportOrders/', 'TransportOrderFaultRow');

Niestety, "autor" serwera zamiast po prostu zwrócić swoją klasę po ERemotableException, to robi taki cyrk, a Delphi tego teraz nie łyka w taki sposób, jak ma to miejsce z typami, które faktycznie są zwracane.

Dodatkowo trzeba mieć na uwadze, że to jedna z wielu możliwych klas "błędu".

0

U mnie zaczytało:

soap.pas

0

@woolfik: No tak, przygotowując własny schemat... Ale zobacz ma tym WSDLu i automatycznie generowany plik z kreatora w Delphi.

3

Udało się znaleźć rozwiązanie - link
Trzeba było włączyć opcję -Ok przy generowaniu i już ładnie rozpoznaje błędy :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1