繁体   English   中英

'解组错误:cvc-complex-type.2.4.a:从元素'XXXXX'开始发现无效内容。 其中一个'{XXXXX}'是预期的

[英]'Unmarshalling Error: cvc-complex-type.2.4.a: Invalid content was found starting with element 'XXXXX'. One of '{XXXXX}' is expected

嗨,我正在通过WSDL将java webservice加载到Delphi 7。当我从delphi调用Web服务时,我收到以下错误。 我没有任何线索就被困在这里。

'解组错误:cvc-complex-type.2.4.a:从元素'XXXXX'开始发现无效内容。 其中一个'{XXXXX}'是预期的

使用WSDL delphi生成下面的代码。 我在下面的代码中删除了许多方法。

   // ************************************************************************ //
// The types declared in this file were generated from data read from the
// WSDL File described below:
// WSDL     : http://localhost/protectappws/services/ProtectappwsImpl?wsdl
// Encoding : UTF-8
// Version  : 1.0
// (3/5/2016 5:55:17 AM - 1.33.2.5)
// ************************************************************************ //

unit ProtectappwsImpl;

interface

uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;

type

  // ************************************************************************ //
  // The following types, referred to in the WSDL document are not being represented
  // in this file. They are either aliases[@] of other types represented or were referred
  // to but never[!] declared in the document. The types from the latter category
  // typically map to predefined/known XML or Borland types; however, they could also 
  // indicate incorrect WSDL documents that failed to declare or import a schema type.
  // ************************************************************************ //
  // !:string          - "http://www.w3.org/2001/XMLSchema"
  // !:boolean         - "http://www.w3.org/2001/XMLSchema"
  // !:int             - "http://www.w3.org/2001/XMLSchema"

  Encrypt              = class;                 { "http://dsws.org/protectappws/" }
  Decrypt              = class;                 { "http://dsws.org/protectappws/" }


   // ************************************************************************ //
  // Namespace : http://dsws.org/protectappws/
  // Serializtn: [xoLiteralParam]
  // ************************************************************************ //
  Encrypt = class(TRemotable)
  private
    Fusername: WideString;
    Fpassword: WideString;
    Fkeyname: WideString;
    Fkeyiv: WideString;
    Ftransformation: WideString;
    Fplaintext: WideString;
  public
    constructor Create; override;
  published
    property username: WideString read Fusername write Fusername;
    property password: WideString read Fpassword write Fpassword;
    property keyname: WideString read Fkeyname write Fkeyname;
    property keyiv: WideString read Fkeyiv write Fkeyiv;
    property transformation: WideString read Ftransformation write Ftransformation;
    property plaintext: WideString read Fplaintext write Fplaintext;
  end;

  EncryptResponse =  type WideString;      { "http://dsws.org/protectappws/"[L] }


  // ************************************************************************ //
  // Namespace : http://dsws.org/protectappws/
  // Serializtn: [xoLiteralParam]
  // ************************************************************************ //
  Decrypt = class(TRemotable)
  private
    Fusername: WideString;
    Fpassword: WideString;
    Fkeyname: WideString;
    Fkeyiv: WideString;
    Ftransformation: WideString;
    Fciphertext: WideString;
  public
    constructor Create; override;
  published
    property username: WideString read Fusername write Fusername;
    property password: WideString read Fpassword write Fpassword;
    property keyname: WideString read Fkeyname write Fkeyname;
    property keyiv: WideString read Fkeyiv write Fkeyiv;
    property transformation: WideString read Ftransformation write Ftransformation;
    property ciphertext: WideString read Fciphertext write Fciphertext;
  end;

  DecryptResponse =  type WideString;      { "http://dsws.org/protectappws/"[L] }


   // ************************************************************************ //
  // Namespace : http://dsws.org/protectappws/
  // soapAction: http://dsws.org/protectappws/%operationName%
  // transport : http://schemas.xmlsoap.org/soap/http
  // style     : document
  // binding   : protectappwsSOAP
  // service   : protectappws
  // port      : protectappwsSOAP
  // URL       : http://localhost/protectappws/services/ProtectappwsImpl
  // ************************************************************************ //
  protectappws = interface(IInvokable)
  ['{EAB73212-14C4-1A41-ABFA-F106C8EB9965}']
    function  Encrypt(const parameters: Encrypt): EncryptResponse; stdcall;
    function  Decrypt(const parameters: Decrypt): DecryptResponse; stdcall;
  end;

function Getprotectappws(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): protectappws;


implementation

function Getprotectappws(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): protectappws;
const
  defWSDL = 'http://localhost/protectappws/services/ProtectappwsImpl?wsdl';
  defURL  = 'http://localhost/protectappws/services/ProtectappwsImpl';
  defSvc  = 'protectappws';
  defPrt  = 'protectappwsSOAP';
var
  RIO: THTTPRIO;
begin
  Result := nil;
  if (Addr = '') then
  begin
    if UseWSDL then
      Addr := defWSDL
    else
      Addr := defURL;
  end;
  if HTTPRIO = nil then
    RIO := THTTPRIO.Create(nil)
  else
    RIO := HTTPRIO;
  try
    Result := (RIO as protectappws);
    if UseWSDL then
    begin
      RIO.WSDLLocation := Addr;
      RIO.Service := defSvc;
      RIO.Port := defPrt;
    end else
      RIO.URL := Addr;
  finally
    if (Result = nil) and (HTTPRIO = nil) then
      RIO.Free;
  end;
end;




constructor Encrypt.Create;
begin
  inherited Create;
  FSerializationOptions := [xoLiteralParam];
end;

constructor Decrypt.Create;
begin
  inherited Create;
  FSerializationOptions := [xoLiteralParam];
end;

initialization
  InvRegistry.RegisterInterface(TypeInfo(protectappws), 'http://dsws.org/protectappws/', 'UTF-8');
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(protectappws), 'http://dsws.org/protectappws/%operationName%');
  InvRegistry.RegisterInvokeOptions(TypeInfo(protectappws), ioDocument);
  InvRegistry.RegisterInvokeOptions(TypeInfo(protectappws), ioLiteral);
  RemClassRegistry.RegisterXSInfo(TypeInfo(EncryptResponse), 'http://dsws.org/protectappws/', 'EncryptResponse');
  RemClassRegistry.RegisterXSInfo(TypeInfo(DecryptResponse), 'http://dsws.org/protectappws/', 'DecryptResponse');
  RemClassRegistry.RegisterXSClass(Encrypt, 'http://dsws.org/protectappws/', 'Encrypt');
  RemClassRegistry.RegisterSerializeOptions(Encrypt, [xoLiteralParam]);
  RemClassRegistry.RegisterXSClass(Decrypt, 'http://dsws.org/protectappws/', 'Decrypt');
  RemClassRegistry.RegisterSerializeOptions(Decrypt, [xoLiteralParam]);

end.

下面是我调用Webservice的Delphi 7代码。

unit Client;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,ProtectappwsImpl, StdCtrls, Buttons, InvokeRegistry, Rio,
  SOAPHTTPClient;

type
  TForm1 = class(TForm)
    memResponse: TMemo;
    memErrors: TMemo;
    btnProcess: TBitBtn;
    procedure btnProcessClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnProcessClick(Sender: TObject);
var
  ECrypt : Encrypt;
  objService : protectappws;
  wsResponse : WideString;


  ProtectApp : protectappws;
begin
  memResponse.Lines.Clear;
  memErrors.Lines.Clear;
  memResponse.Refresh;
  memErrors.Refresh;
  try
    ECrypt :=  Encrypt.Create;


    ECrypt.username := 'kenwhite';
    ECrypt.password := 'kenwhite';
    ECrypt.keyname := 'MYKEY';
    ECrypt.plaintext := 'Hi';


    objService := Getprotectappws(True,EmptyStr,nil);

    wsResponse :=  objService.Encrypt(ECrypt);


  except
    on E: Exception do
    begin
       showmessage(e.Message);
    end;
  end;
end;

end.

当我在delphi代码上面运行时,我遇到了错误

'解组错误:cvc-complex-type.2.4.a:找到以元素'username'开头的无效内容。 其中一个'{username}'是预期的

Delphi正在向java web服务发送以下请求

<?xml version="1.0"?>

-<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">


-<SOAP-ENV:Body>


-<Encrypt xmlns="http://dsws.org/protectappws/">

<username>kenwhite</username>

<password>kenwhite</password>

<keyname>MYKEY</keyname>

<keyiv/>

<transformation/>

<plaintext>Hi</plaintext>

</Encrypt>

</SOAP-ENV:Body>

</SOAP-ENV:Envelope>

但是webservice正在考虑下面的请求。

<?xml version="1.0"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:prot="http://dsws.org/protectappws/"><soapenv:Header/>
   <soapenv:Body>
         <prot:Encrypt><username>kenwhite</username>
         <password>kenwhite</password>
         <keyname>MYKEY</keyname>
         <!--Optional:-->
         <keyiv/>
         <!--Optional:-->
         <transformation/>
         <plaintext>Hi</plaintext>
      </prot:Encrypt>
   </soapenv:Body>
</soapenv:Envelope>

为什么delphi生成的请求存在差异,客户端期望不同的请求。

我尝试从下面的代码中删除ioDocument并保持ioLiteral,反之亦然

  InvRegistry.RegisterInvokeOptions(TypeInfo(protectappws), ioDocument);
  InvRegistry.RegisterInvokeOptions(TypeInfo(protectappws), ioLiteral);

Delphi 7正在使用SOAP-ENV生成soap请求,而java正在期待soapenv。 我真的很困惑,坚持这个。

为了解决这个问题,我修改了soap请求。

Delphi 7中有一个错误,所以它不允许我更改soap请求。 为了解决这个问题我已经下载Soapfix从Embarcadero和改变HTTPRIO组件的SOAP请求onbeforeExecute事件,并开始工作。 :)

在修改请求之前,我们只需要知道Web服务的期望并更改请求。

从我的请求XML我刚刚从加密节点删除了名称空间,它正在工作。

<Encrypt xmlns="http://dsws.org/protectappws/">

我修改了请求xml

<?xml version="1.0"?>

-<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">

-<SOAP-ENV:Body>

-<Encrypt>

<username>kenwhite</username>

<password>kenwhite</password>

<keyname>MYKEY</keyname>

<keyiv/>

<transformation/>

<plaintext>Hi</plaintext>

</Encrypt>

</SOAP-ENV:Body>

</SOAP-ENV:Envelope>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM