Sample code for 30+ languages & platforms
Pascal (Lazarus/Delphi)

XML Inclusive Canonicalization

See more XML Digital Signatures Examples

Demonstrates how to convert XML to the Inclusive XML Canonicalization form as specified in http://www.w3.org/TR/xml-c14n/

Chilkat Pascal (Lazarus/Delphi) Downloads

Pascal (Lazarus/Delphi)
program ChilkatDemo;

// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  SysUtils,
  CkDllLoader,
  Chilkat.Http,
  Chilkat.StringBuilder,
  Chilkat.XmlDSig;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  success: Boolean;
  http: THttp;
  sbXml: TStringBuilder;
  canon: TXmlDSig;
  canonVersion: string;
  withComments: Boolean;
  url: string;
  xmlInclCanon: string;
  xmlExclCanon: string;

begin
  success := False;

  //  This example requires the Chilkat API to have been previously unlocked.
  //  See Global Unlock Sample for sample code.

  //  The XML digital signature verification class provides utility methods for
  //  XML canonicalization.  This example demonstrates how to do inclusive XML canonicalization.

  http := THttp.Create;
  sbXml := TStringBuilder.Create;
  canon := TXmlDSig.Create;

  //  Use inclusive XML canonicalization.
  canonVersion := 'C14N';
  withComments := False;

  url := 'https://www.chilkatsoft.com/exampleData/c14n/test7.xml';
  success := http.QuickGetSb(url,sbXml);

  //  This is the input XML:
  //  The XML comment is referring to when exclusive XML canonicalization is applied.  With inclusive canonicalization, the namespace nodes
  //  are kept, as we'll see below..

  //  <doc>
  //  <!-- A namespace node N is ignored if the nearest ancestor element of the node's parent element that is in the node-set has a namespace node in the node-set with the same local name and value as N. -->
  //  	<animal xmlns:aa="https://www.animal.com/">
  //  		<reptile xmlns:bb="https://www.reptile.com/">
  //    			<lizard xmlns="" type="african fat tailed" abc="xyz" xmlns:aa="https://www.animal.com/" />
  //    			<snake type="poisonous rattler" xmlns:bb="https://www.reptile.com/" >
  //    			</snake>
  //    		</reptile>
  //    	</animal>
  //  </doc>

  xmlInclCanon := canon.CanonicalizeXml(sbXml.GetAsString(),canonVersion,withComments);
  WriteLn(xmlInclCanon);

  //  The C14N (inclusive) canonicalization is:

  //  <doc>
  //  
  //  	<animal xmlns:aa="https://www.animal.com/">
  //  		<reptile xmlns:bb="https://www.reptile.com/">
  //    			<lizard abc="xyz" type="african fat tailed"></lizard>
  //    			<snake type="poisonous rattler">
  //    			</snake>
  //    		</reptile>
  //    	</animal>
  //  </doc>

  //  To see the difference, let's do exclusive canonicalization..
  canonVersion := 'EXCL_C14N';

  xmlExclCanon := canon.CanonicalizeXml(sbXml.GetAsString(),canonVersion,withComments);
  WriteLn(xmlExclCanon);

  //  // The C14N (exclusive) canonicalization is:
  //  
  //  <doc>
  //  
  //  	<animal>
  //  		<reptile>
  //    			<lizard abc="xyz" type="african fat tailed"></lizard>
  //    			<snake type="poisonous rattler">
  //    			</snake>
  //    		</reptile>
  //    	</animal>
  //  </doc>


  http.Free;
  sbXml.Free;
  canon.Free;

end;

// ---------------------------------------------------------------------------

begin

  try
    RunDemo;
  except
    on E: Exception do
      WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
  end;

  WriteLn;
  {$IFDEF MSWINDOWS}
  WriteLn('Press Enter to exit...');
  ReadLn;
  {$ENDIF}
end.