Delphi Examples

ChilkatHOMEAndroid™ASPVisual BasicVB.NETC#iOS (IPhone)Objective-CC++CMFCDelphiFoxProJavaPerl
PHP ExtensionPHP ActiveXPythonPowerShellRubySQL ServerVBScript

Delphi Examples

Bounced Mail
Bz2
Character Encoding
CSV
DKIM / DomainKey
Digital Certificates
Digital Signatures
DH Key Exchange
DSA
Email
Email Object
FTP
HTML Conversion
HTTP
IMAP
Encryption
MHT / HTML Email
NTLM
POP3
RSA
S/MIME
SMTP
Socket
Spider
SFTP
SSH
SSH Key
SSH Tunnel
String
Tar
Upload
XML
XMP
Zip Compression

More Examples...
Amazon S3
Byte Array
FileAccess
RSS
Atom
Self-Extractor
Service
PPMD
Deflate
Bzip2
LZW

Type Conversion

 

Article: Understanding COM References in Delphi

Parse SOAP XML

Demonstrates how to parse SOAP XML.

Download Chilkat XML ActiveX

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.

Mail Component · .NET Email Component · XML Parser