2013-02-19 12 views
7

xmlにSOAP応答を保存するにはどうすればよいですか?私はこの単純なcode.Theを試してみました(タイプ(OLESTR)デルファイの石鹸応答がxmlに保存されますか?

にタイプ(ヌル)のvarinatを変換することができませんでした、ファイルストリーム、TStringListにしてみましたxmlファイルを作成しますが、私は

を得ました応答はempty.Theファイルサイズの40メガバイトではありません。デルファイXE3。

procedure TForm1.HTTPRIO1AfterExecute(const MethodName: string; 
SOAPResponse: TStream); 
var xml : TStringlist; 
begin 
xml := TStringlist.create; 
    try 
    soapresponse.Position:=0; 
    xml.LoadFromStream(SOAPResponse); 
    xml.SaveToFile('...file.xml'); 
finally 
    xml.Free; 
end; 
end; 

これが問題(空行)です?か?

... 

- <leiras> 
- <![CDATA[ 
* Socket AM2 for AMD Athlon™ 64FX/64X2/64 and Sempron processors 
* ULi M1697 

1. Supports FSB 1000MHz (2.0GT/s), Hyper-Transport Technology and AMD Cool 'n' Quiet Technology 
2. Untied Overclocking : During Overclocking, FSB enjoys better margin due to fixed PCIE/ PCI Buses 
3. Supports Dual Channel DDRII800/667/533, 4 x DIMM slots, with maximum capacity up to 8GB 
4. Hybrid Booster - ASRock Safe Overclocking Technology 
5. Supports Dual Graphics XLI 
6. 1 x PCI Express x16 slot 
7. 1 x PCI Express x 8 slot, to adopt 2nd PCI Express x 16 VGA card and other PCI Express x4, x2, x1 interface cards 
8. 2 x PCI Express x1 slots 
9. 4 x Serial ATA II 3.0Gb/s, support RAID (RAID 0, 1, 0+1, JBOD and RAID 5), NCQ, AHCI and "Hot Plug" functions 
10. 2 x eSATAII 3.0Gb/s, support NCQ, AHCI and "Hot Plug" functions 
11. HDMI_SPDIF header, providing SPDIF audio output to HDMI VGA card, allows the system to connect HDMI Digital TV/projector/LCD devices. 
12. 7.1 Channel with High Definition Audio 
13. Windows Vista™ Premium Logo Hardware Ready 
14. ASRock 8CH_eSATAII I/O: 2 eSATAII ports, HD 7.1 channel audio jacks 


]]> 
</leiras> 
<kepek /> 

... 

私はNullStrictConvertを試しました:= False;変換エラーはありませんが、EXEは1GBのRAMを使用しています。

... 
var xml : TStringlist; 
begin 
xml := TStringlist.create; 
NullStrictConvert := False; 
try 
    soapresponse.Position:=0; 

... 
+2

ことが重要である、ブレークポイントは、あなたの最高の友人です。 – ComputerSaysNo

+2

これは私にとっては正しいと思われます。いくつかのデバッグ文を入れる時間、おそらく最初の255文字のShowMessageかそのようなもの。 –

+0

私はブレークポイントを追加しました。 xml.savetofile Ok->ファイルを作成し、soap.rioユニットを開き、次の行でブレーク(エラー)します。FConverter.ProcessResponse(RespXML、IntfMD、MethMD、Context、FHeadersInbound) – Lacika

答えて

0

一時的な文字列変数にストリームのReadメソッドを使用してみてください:

procedure TForm1.HTTPRIO1AfterExecute(const MethodName: string; SOAPResponse: TStream); 
var 
    s: string[200]; 
    ds: string; 
    n: Longint; 
    xml: TStringList; 
begin 
    SOAPResponse.Position := 0; 
    xml := TStringList.Create; 
    try 
    ds := EmptyStr; 
    while SOAPResponse.Position < SOAPResponse.Size do begin 
     n := SOAPResponse.Read(s[1], 200); 
     SetLength(s, n); 
     xml.Text := xml.Text + ds; 
    end; 

    xml.SaveToFile('...file.xml'); 
    finally 
    xml.Free; 
    end; 
end; 
+0

ありがとうございます。明日に試してみます。 – Lacika

+0

同じ問題:( – Lacika

1

あなたはそこに何があるか確認するために、ファイルに直接ストリームをダンプしてみましたか?

procedure TForm1.HTTPRIO1AfterExecute(const MethodName: string; SOAPResponse: TStream); 
var 
    FS: TFileStream; 
begin 
    FS := TFileStream.Create('C:\Downloaded.xml', fmCreate); 
    try 
    FS.CopyFrom(SoapResponse, 0); 
    finally 
    FS.Free; 
    end; 
end; 
+0

ありがとう。明日も試してみよう。 – Lacika

+0

私は@kobikが提案している通り、 'TFileStream'はこの目的のためにさらに読みやすくなっている[+1] – TLama

+0

同じ問題:( – Lacika

0

奇妙です。
この例が役立つかもしれません。
私はほとんど同じことをやっています。レスポンスを記録し、TMemoにリクエストします。
はまた、私のルーチンは、外部FSoapData TStringStreamから実際のSOAPRequestいっぱい「の前に」:あなたのデルファイ版@Lacika

procedure TFrmTestEWS.HTTPRIOBeforeExecute(const MethodName: string; SOAPRequest: TStream); 
var 
    TS: TStringStream; 
    S : String; 
begin 
    // 1. Fill request 
    SOAPRequest.Position := 0; 
    FSoapData.Position := 0; 
    SOAPRequest.CopyFrom(FSoapData,FSoapData.Size); 
    SOAPRequest.Size := FSoapData.Size; 
    // 2. Logging 
    S := 'Request:' + #13#10#13#10; 
    TS := TStringStream.Create(S); 
    try 
     TS.Position := Length(S); 
     FSoapData.Position := 0; 
     TS.CopyFrom(FSoapData,FSoapData.Size); 
     TS.Position := 0; 
     MmoLog.Lines.LoadFromStream(TS); 
    finally 
     TS.Free; 
    end; 
end; 

procedure TFrmTestEWS.HTTPRIOAfterExecute(const MethodName: string; SOAPResponse: TStream); 
var 
    TS: TStringStream; 
    S : String; 
begin 
    S := MmoLog.Text + #13#10#13#10 + 'Response:' + #13#10#13#10; 
    TS := TStringStream.Create(S); 
    try 
     TS.Position := Length(S); 
     SOAPResponse.Position := 0; 
     TS.CopyFrom(SOAPResponse,SOAPResponse.Size); 
     TS.Position := 0; 
     MmoLog.Lines.LoadFromStream(TS); 
    finally 
     SOAPResponse.Position := 0; 
     TS.Free; 
    end; 
end; 
関連する問題