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

Move XML Subtree to Another XML Document

Demonstrates using the InsertChildTreeBefore method to move a fragment of XML from one document to another.

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.Xml;

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

procedure RunDemo;
var
  srcXml: TXml;
  destXml: TXml;
  crmCust: TXml;
  crmSaveCust: TXml;

begin
  //  Source XML is this:

  //  <?xml version='1.0' encoding='UTF-8'?>
  //  <soapenv:Envelope xmlns:"soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  //                <soapenv:Header/>
  //                <soapenv:Body>
  //                              <GetCustomerResponse xmlns="http://www.midoco.de/crm" xmlns:tns="http://www.midoco.de/ws">
  //                                            <CrmCustomer addresseeLine1="Max Mustermann" addresseeLine2="" changingUser="123456" >
  //                                                           <CrmAddress addressId="2225355" addressTypeId="1" checkStatus="O" city="Wien" countryCode="AT" customerId="000071"/>
  //                                                           <CrmPerson birthDay="30" birthMonth="8" birthYear="1977" birthday="1977-08-30T00:00:00.000+02:00" birthdayNotProvided="false"/>
  //                                            </CrmCustomer>
  //                            </GetCustomerResponse>
  //                </soapenv:Body>
  //  </soapenv:Envelope>

  //  Build the source XML.
  srcXml := TXml.Create;
  srcXml.Tag := 'soapenv:Envelope';
  srcXml.AddAttribute('xmlns:soapenv','http://schemas.xmlsoap.org/soap/envelope/');
  srcXml.UpdateChildContent('soapenv:Header','');
  srcXml.UpdateAttrAt('soapenv:Body|GetCustomerResponse',True,'xmlns','http://www.midoco.de/crm');
  srcXml.UpdateAttrAt('soapenv:Body|GetCustomerResponse',True,'xmlns:tns','http://www.midoco.de/ws');
  srcXml.UpdateAttrAt('soapenv:Body|GetCustomerResponse|CrmCustomer',True,'addresseeLine1','Max Mustermann');
  srcXml.UpdateAttrAt('soapenv:Body|GetCustomerResponse|CrmCustomer',True,'addresseeLine2','');
  srcXml.UpdateAttrAt('soapenv:Body|GetCustomerResponse|CrmCustomer',True,'changingUser','123456');
  srcXml.UpdateAttrAt('soapenv:Body|GetCustomerResponse|CrmCustomer|CrmAddress',True,'addressId','2225355');
  srcXml.UpdateAttrAt('soapenv:Body|GetCustomerResponse|CrmCustomer|CrmAddress',True,'addressTypeId','1');
  srcXml.UpdateAttrAt('soapenv:Body|GetCustomerResponse|CrmCustomer|CrmAddress',True,'checkStatus','O');
  srcXml.UpdateAttrAt('soapenv:Body|GetCustomerResponse|CrmCustomer|CrmAddress',True,'city','Wien');
  srcXml.UpdateAttrAt('soapenv:Body|GetCustomerResponse|CrmCustomer|CrmAddress',True,'countryCode','AT');
  srcXml.UpdateAttrAt('soapenv:Body|GetCustomerResponse|CrmCustomer|CrmAddress',True,'customerId','000071');
  srcXml.UpdateAttrAt('soapenv:Body|GetCustomerResponse|CrmCustomer|CrmPerson',True,'birthDay','30');
  srcXml.UpdateAttrAt('soapenv:Body|GetCustomerResponse|CrmCustomer|CrmPerson',True,'birthMonth','8');
  srcXml.UpdateAttrAt('soapenv:Body|GetCustomerResponse|CrmCustomer|CrmPerson',True,'birthYear','1977');
  srcXml.UpdateAttrAt('soapenv:Body|GetCustomerResponse|CrmCustomer|CrmPerson',True,'birthday','1977-08-30T00:00:00.000+02:00');
  srcXml.UpdateAttrAt('soapenv:Body|GetCustomerResponse|CrmCustomer|CrmPerson',True,'birthdayNotProvided','false');

  //  Destination XML is this:

  //  <?xml version="1.0" encoding="utf-8"?>
  //  <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  //      <SOAP-ENV:Header>
  //          <m:Credentials xmlns:m="http://www.midoco.de/system">
  //              <m:Login>User</m:Login>
  //              <m:Password>Pass</m:Password>
  //              <m:OrgUnit>ABC</m:OrgUnit>
  //              <m:Locale>de_DE</m:Locale>
  //          </m:MidocoCredentials>
  //      </SOAP-ENV:Header>
  //      <SOAP-ENV:Body>
  //          <SaveCustomerRequest>
  //          </SaveCustomerRequest>
  //      </SOAP-ENV:Body>
  //  </SOAP-ENV:Envelope>

  destXml := TXml.Create;
  destXml.Tag := 'SOAP-ENV:Envelope';
  destXml.AddAttribute('xmlns:SOAP-ENV','http://schemas.xmlsoap.org/soap/envelope/');
  destXml.AddAttribute('xmlns:SOAP-ENC','http://schemas.xmlsoap.org/soap/encoding/');
  destXml.AddAttribute('xmlns:xsi','http://www.w3.org/2001/XMLSchema-instance');
  destXml.AddAttribute('xmlns:xsd','http://www.w3.org/2001/XMLSchema');
  destXml.UpdateAttrAt('SOAP-ENV:Header|m:Credentials',True,'xmlns:m','http://www.midoco.de/system');
  destXml.UpdateChildContent('SOAP-ENV:Header|m:Credentials|m:Login','User');
  destXml.UpdateChildContent('SOAP-ENV:Header|m:Credentials|m:Password','Pass');
  destXml.UpdateChildContent('SOAP-ENV:Header|m:Credentials|m:OrgUnit','ABC');
  destXml.UpdateChildContent('SOAP-ENV:Header|m:Credentials|m:Locale','de_DE');
  destXml.UpdateChildContent('SOAP-ENV:Body|SaveCustomerRequest','');

  //  We want to move the "CrmCustomer" subtree in the source XML to inside the "SaveCustomerRequest" element in the destination.

  //  Navigate to CrmCustomer
  crmCust := srcXml.FindChild('soapenv:Body|GetCustomerResponse|CrmCustomer');
  if (srcXml.LastMethodSuccess <> True) then
    begin
      WriteLn('Failed to find CrmCustomer element.');
      Exit;
    end;

  //  Navigate to SaveCustomerRequest
  crmSaveCust := destXml.FindChild('SOAP-ENV:Body|SaveCustomerRequest');
  if (destXml.LastMethodSuccess <> True) then
    begin
      WriteLn('Failed to find SaveCustomerRequest element.');
      Exit;
    end;

  //  Move CrmCustomer tree to SaveCustomerRequest.
  crmSaveCust.InsertChildTreeBefore(0,crmCust);

  crmCust.Free;
  crmSaveCust.Free;

  //  Look at the resulting destXml.  You can see the CrmCustomer subtree moved to underneath SaveCustomerRequest.
  WriteLn(destXml.GetXml());

  //  <?xml version="1.0" encoding="utf-8"?>
  //  <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  //      <SOAP-ENV:Header>
  //          <m:Credentials xmlns:m="http://www.midoco.de/system">
  //              <m:Login>User</m:Login>
  //              <m:Password>Pass</m:Password>
  //              <m:OrgUnit>ABC</m:OrgUnit>
  //              <m:Locale>de_DE</m:Locale>
  //          </m:Credentials>
  //      </SOAP-ENV:Header>
  //      <SOAP-ENV:Body>
  //          <SaveCustomerRequest>
  //              <CrmCustomer addresseeLine1="Max Mustermann" addresseeLine2="" changingUser="123456">
  //                  <CrmAddress addressId="2225355" addressTypeId="1" checkStatus="O" city="Wien" countryCode="AT" customerId="000071"/>
  //                  <CrmPerson birthDay="30" birthMonth="8" birthYear="1977" birthday="1977-08-30T00:00:00.000+02:00" birthdayNotProvided="false"/>
  //              </CrmCustomer>
  //          </SaveCustomerRequest>
  //      </SOAP-ENV:Body>
  //  </SOAP-ENV:Envelope>

  //  Look at the resulting srcXml.  The CrmCustomer subtree was removed.
  WriteLn(srcXml.GetXml());

  //  <?xml version="1.0" encoding="utf-8"?>
  //  <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  //      <soapenv:Header/>
  //      <soapenv:Body>
  //          <GetCustomerResponse xmlns="http://www.midoco.de/crm" xmlns:tns="http://www.midoco.de/ws"/>
  //      </soapenv:Body>
  //  </soapenv:Envelope>


  srcXml.Free;
  destXml.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.