【问题标题】:Delphi SoapRequest converting < > to &lt; &gt;Delphi SoapRequest 将 < > 转换为 < >
【发布时间】:2014-08-20 21:35:11
【问题描述】:

Continuation to this..

我们设法在服务器端生成日志..当我们传递的输入有宽字符串时,我们正在获取带有 & lt; 的 XML & gt;(not:-no space between characters) 而不是 ..Delphi 有什么办法限制这个吗?

甚至在 HTTPRIO1.BeforeExecute 中尝试过 StringReplace..

  LDocument := NewXMLDocument;
  LDocument.Active := True;
  LDocument.Encoding := 'utf-8';
  LDocument.Options := [doNodeAutoIndent];
  ns := 'http://www.bank.com/dox/service/v1.0.0';
  RootNode := LDocument.AddChild('AgreementSearchRequest');
  RootNode.Attributes['xmlns:i'] := 'http://www.w3.org/2001/XMLSchema-instance';
  RootNode.DeclareNamespace('', ns);

  HeaderNode := RootNode.AddChild('Header', ns);
  HeaderNode.AddChild('PageNo').Text := '1';
  HeaderNode.AddChild('PageSize').Text := '10';
  HeaderNode.AddChild('Source').Text := 'IFBD';

  SearchCriteriaNode := RootNode.AddChild('SearchCriteria', ns);
  SearchCriteriaNode.AddChild('AgreementId').Text := '5027222';
  SearchCriteriaNode.AddChild('IsOffshoreUser').Text := 'true';
  BankLegalNode := SearchCriteriaNode.AddChild('BankLegalEntities');
  LegalNode := BankLegalNode.AddChild('BankLegalEntity');
  LegalNode.AddChild('GCRS').Text := 'Search LEgal Entity';
  LegalNode.AddChild('BankLegalEntityName').Text :=
    'Search Legal Entity Category';
  DocSearchOut := SearchArgsResponse.Create();
  DoxSerchIn := SearchArgs.Create();
  DoxSerchIn.SearchArgs := LDocument.DocumentElement.XML;
  DoxService := GetIDoxService(True,'',HTTPRIO1);
  DocSearchOut :=DoxService.SearchAgreements(DoxSerchIn)  

在执行之前尝试转换,但是当它将字符串转换为流时

procedure TFormDelegate.HTTPRIO1BeforeExecute(const MethodName: string;
  SOAPRequest: TStream);
var
  StrStrm : TStringStream;
  xml,xml1,xml2: TStringList;
begin
  ShowMessage(MethodName);
  Memo1.Clear;
    StrStrm := TStringStream.Create();
    xml := TStringList.Create;
    xml1 := TStringList.Create;
    xml2 := TStringList.Create;
    try
      xml.Text := StreamToString(SOAPRequest);
      xml2.Text := StringReplace(xml.Text,'&lt;','<', [rfReplaceAll, rfIgnoreCase]);
      xml1.Text := StringReplace(xml2.Text,'&gt;','>', [rfReplaceAll, rfIgnoreCase]);
      xml2.Text := StringReplace(xml1.Text,'<parameters>','', []);
      xml1.Text := StringReplace(xml2.Text,'</parameters>','', []);
      xml1.SaveToFile('response1.xml');
      //SOAPRequest := StringToStream(xml1.Text);
      SOAPRequest:=  StringToStream(xml1.Text);
    except
      xml.Free;
       xml1.Free;
        xml2.Free;
     StrStrm.Free;
    end;
    Memo1.Lines.Append(StreamToString(SOAPRequest));
end;

服务器端日志..

  <SOAP-ENV:Body>
    <SearchAgreements xmlns="http://www.bank.com/dox/service/v1.0.0">
      <parameters>
   <searchRequest>&lt;AgreementSearchRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.bank.com/dox/service/v1.0.0"& gt;
  & lt;Header&gt;
    & lt;PageNo&gt;1& lt;/PageNo&gt;
    & lt;PageSize&gt;10& lt;/PageSize&gt;
    & lt;Source&gt;IFBD&l t;/Source&gt;
  & lt;/Header&gt;
  & lt;SearchCriteria& gt;
    & lt;AgreementId& gt;5027222& lt;/AgreementId& gt;
    & lt;IsOffshoreUser& gt;true&lt;/IsOffshoreUser& gt;
    & lt;bankLegalEntities&gt;
      & lt;bankLegalEntity& gt;
        & lt;GCRS&gt;Search LEgal Entity&lt;/GCRS&gt;
        & lt;bankLegalEntityName&gt;Search Legal Entity Category& lt;/bankLegalEntityName& gt;
      & lt;/bankLegalEntity& gt;
    & lt;/bankLegalEntities&gt;
  & lt;/SearchCriteria& gt;
& lt;/AgreementSearchRequest& gt;</searchRequest>
      </parameters>
    </SearchAgreements>
  </SOAP-ENV:Body>

【问题讨论】:

  • 如果你想将 XML 作为一个更大的 XML 文档中的元素值发送,你需要使用&lt;![CDATA[Your XML Data]]&gt;tag 告诉解析器不要解析数据块。

标签: xml web-services delphi delphi-2010


【解决方案1】:

我不确定这是否可能,但我怀疑这是否是您想要的。

以下不是技术描述,而是我个人对此的看法。 SOAP 发送一个已经是 XML 的请求,它会同时发送您自己的数据。

如果您保留小于 &lt; 和大于 &gt; 的字符,您发送的数据将被视为 SOAP 请求中 data 节点的子节点。
您不希望这样,因为它是您想要实现的任何目标的数据,而不是 SOAP 的一部分。

您可以尝试获取soaprequest,从data 节点中提取xml 作为字符串。 对该字符串执行 stringreplace 并将其解析为 xml。

希望这会有所帮助。

编辑

问题出在您的 SOAP 消息中,尽管它并不是真正的一个问题。
如果您阅读了上述内容,您不希望将您的 xml 视为子节点,而是在使用 SOAP 发送它时将其视为消息。因此,当您使用 SOAP 发送它时,&lt;&gt; 字符将转换为 &amp;lt; &amp;gt;。如果您想将其转换回&lt;&gt;,则必须在服务器端执行此操作。您可以在发送前更改它,但这根本没有区别,因为它无论如何都会被转换。
所以在另一端这样做可能是唯一的方法。

【讨论】:

  • 事实上我尝试了字符串替换功能,我相信当它将字符串转换为流(Web服务的输入)时会产生这个问题
  • 我绝对喜欢在服务器端,不幸的是 web 服务归其他团队所有,我很难说服他们:(
【解决方案2】:

我们在执行之前修改了 HTTPRIO,稍作修改,我们就能够成功地将 XML 发送到服务。

procedure HTTPRIO1SoapBeforeExecute(const MethodName: string;
  SOAPRequest: TStream);
var
 StrTemp,Fheader : TStringList;
  StrBeg,StrEnd,StrParam,StrParam1  : TStringList;
  StreamTemp : TStream;
  StrLst : TStringList;
  StrLstTmp: TStringList;

begin
  StrBeg:=TStringList.Create();
  StrEnd:=TStringList.Create();
  SOAPRequest.Position := 0;
  StrTemp.LoadFromStream(SOAPRequest);
  StrBeg.Text := StringReplace(StrTemp.Text,'&lt;','<',[RfReplaceAll]);
  StrEnd.Text := StringReplace(StrBeg.Text,'&gt;','>',[RfReplaceAll]);
  SOAPRequest.Position:=0;
  SOAPRequest.Size := 0; //Clear the Stream
  StrEnd.SaveToStream(SOAPRequest); //Reinitialise the stream with right string.
  SOAPRequest.Position :=0;
end;

【讨论】:

    猜你喜欢
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 2013-10-30
    • 2011-06-28
    • 1970-01-01
    相关资源
    最近更新 更多