Chilkat
HOME
Android™
ASP
Visual Basic
VB.NET
C#
iOS (IPhone)
Objective-C
C++
C
MFC
Delphi
FoxPro
Java
Perl
PHP Extension
PHP ActiveX
Python
PowerShell
Ruby
SQL Server
VBScript
Parse SOAP XMLDemonstrates how to parse SOAP XML. uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, CHILKATXMLLib_TLB, OleCtrls; ... procedure TForm1.Button1Click(Sender: TObject); var success: Integer; xml: CHILKATXMLLib_TLB.IChilkatXml; xmlFields: CHILKATXMLLib_TLB.IChilkatXml; i: Integer; xmlField: CHILKATXMLLib_TLB.IChilkatXml; numChildren: Integer; begin xml := TChilkatXml.Create(Self).ControlInterface; // The Chilkat XML component is freeware. // Load an XML document. // This document may be downloaded at: // http://www.chilkatsoft.com/testData/soap1.xml success := xml.LoadXmlFile('soap1.xml'); if (success = 0) then begin ShowMessage(xml.LastErrorText); Exit; end; // The sample XML document parsed here is a prime example // of how NOT to design your XML schema. When designing // XML, always keep in mind how a program might parse it. // Poorly designed XML is a big pain-in-the-ass to parse. // We'll show you a much better schema at the end of this // example. // Here's the XML we'll want to parse: // <?xml version="1.0" encoding="utf-8"?><soap:Envelope // xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" // xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" // xmlns:xsd="http://www.w3.org/2001/XMLSchema"> // <soap:Body> // <SendRequestResponse // xmlns="http://merchantwarehouse.com/webservices/public/MerchantWareService1"> // <SendRequestResult> // <Code>Approved</Code> // <ProcessorData>[Response_Code][00][Response_Text][106857][Auth_Reference // ][0016][Amount_Balance][205.78][Expiration_Date][012014][Trans_Date_Time // ][012209000734][Card_Number][710001900593731][Transaction_ID][1]</ProcessorData> // <Fields><Field> // <Code>Unknown</Code><Value>1</Value> // </Field> // <Field> // <Code>Message</Code><Value>106857</Value> // </Field> // <Field> // <Code>AuthCodeResp</Code><Value>0016</Value> // </Field> // <Field> // <Code>Balance</Code><Value>205.78</Value> // </Field> // </Fields> // </SendRequestResult> // </SendRequestResponse> // </soap:Body> // </soap:Envelope> // The poor design choice in the above XML is to use the same tag over and over. // For example "Field", "Code", and "Value". // Here's a much much better design, and you'll see later how the parsing is so much simpler: // // ... // <Fields> // <Message>106857</Message> // <AuthCodeResp>0016</AuthCodeResp> // <Balance>205.78</Balance> // </Fields> // ... // Notice it's much more compact. // The other poor design choice is globbing all of that information in "ProcessorData". // You can't use XML alone to parse the contents of that node -- you'll have to write // some custom string parsing code for it... (ughhh) // // OK... so let's parse this beast... // We already have it loaded in an instance of the XML object. // Drill down to the SendRequestResult node: xml.FirstChild2(); xml.FirstChild2(); xml.FirstChild2(); // Find the "Fields" node: xmlFields := xml.GetChildWithTag('Fields'); // Iterate over each field: numChildren := xmlFields.NumChildren; for i := 0 to numChildren - 1 do begin xmlField := xmlFields.GetChild(i); if (xmlField.HasChildWithTagAndContent('Code','Message') = 1) then begin Memo1.Lines.Add('Message: ' + xmlField.GetChildContent('Value')); end; // Use the same logic for the other fields you want to capture... end; // Here's the XML parsing code if the XML were designed like this: // ... // <Fields> // <Unknown>1</Unknown> // <Message>106857</Message> // <AuthCodeResp>0016</AuthCodeResp> // <Balance>205.78</Balance> // </Fields> // ... success := xml.LoadXmlFile('soap2.xml'); if (success = 0) then begin ShowMessage(xml.LastErrorText); Exit; end; xml.FirstChild2(); xml.FirstChild2(); xml.FirstChild2(); // Find the "Fields" node: xmlFields := xml.GetChildWithTag('Fields'); // Get each value: Memo1.Lines.Add('-----'); Memo1.Lines.Add('Message: ' + xmlFields.GetChildContent('Message')); Memo1.Lines.Add('AuthCodeResp:' + xmlFields.GetChildContent('AuthCodeResp')); Memo1.Lines.Add('Balance: ' + xmlFields.GetChildContent('Balance')); end; |
© 2000-2010 Chilkat Software, Inc. All Rights Reserved.