Sample code for 30+ languages & platforms
Delphi DLL

XMP Array Property - Bag, Seq, or Alt

See more XMP Examples

How to insert or update an XMP array property (bag, seq, or alt).

Chilkat Delphi DLL Downloads

Delphi DLL
uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Xmp, StringArray, Xml;

...

procedure TForm1.Button1Click(Sender: TObject);
var
success: Boolean;
xmp: HCkXmp;
xml: HCkXml;
sa: HCkStringArray;

begin
success := False;

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

xmp := CkXmp_Create();

// Load a JPG or TIF image file.
// Sample JPG's with XMP metadata may be found at:
// http://www.chilkatsoft.com/testData/xmp/sample1.jpg
// http://www.chilkatsoft.com/testData/xmp/sample2.jpg
// http://www.chilkatsoft.com/testData/xmp/sample3.jpg
success := CkXmp_LoadAppFile(xmp,'sample1.jpg');
if (success <> True) then
  begin
    Memo1.Lines.Add(CkXmp__lastErrorText(xmp));
    Exit;
  end;

Memo1.Lines.Add('Num embedded XMP docs: ' + IntToStr(CkXmp_getNumEmbedded(xmp)));

// Assuming there is at least one, get the 1st.
// (There is typically never more than one, but theoretically it's possible.)

xml := CkXmp_GetEmbedded(xmp,0);
if (CkXmp_getLastMethodSuccess(xmp) = True) then
  begin

    // Create an object to hold one or more string values.
    sa := CkStringArray_Create();
    success := CkStringArray_Append(sa,'value_1');
    success := CkStringArray_Append(sa,'value_2');
    // ...

    success := CkXmp_AddArray(xmp,xml,'bag','Iptc4xmpCore:Chilkat',sa);
    if (success <> True) then
      begin
        Memo1.Lines.Add(CkXmp__lastErrorText(xmp));
      end
    else
      begin
        // Save the JPG.
        success := CkXmp_SaveAppFile(xmp,'modified.jpg');
        if (success <> True) then
          begin
            Memo1.Lines.Add(CkXmp__lastErrorText(xmp));
          end;

      end;
    CkXml_Dispose(xml);

  end
else
  begin
    Memo1.Lines.Add(CkXmp__lastErrorText(xmp));
  end;

CkXmp_Dispose(xmp);
    CkStringArray_Dispose(sa);

end;