Hi Dave
Yes, that should really be documented better. Here's an example for you.
{
Output all entries of dc:subject->rdf:Bag into "memo1"
Example XMP content:
       <dc:subject>
          <rdf:Bag>
             <rdf:li>China</rdf:li>
             <rdf:li>Jan 1985</rdf:li>
             <rdf:li>QJ class</rdf:li>
          </rdf:Bag>
       </dc:subject>
}
var
  xmpDict: TIEDictionary;  // Dict contailing image XMP data
  navDict: TIEDictionary;  // Dict to navigate XML structure
  list: TObjectList;
  i: integer;
begin
  ImageEnView1.IO.LoadFromFile( 'D:\XMP_Data_2021121775013_J.-000.JPG' );
  // Get XMP
  xmpDict := ImageEnView1.IO.Params.Dict.GetDictionary('XMP');
  // Output all entries of dc:subject->rdf:Bag into "memo1"
  navDict := xmpDict.GetDictionary('dc:subject', True);
  navDict := navDict.GetDictionary('#content', false);
  navDict := navDict.GetDictionary('rdf:Bag', false);
  navDict := navDict.GetDictionary('#content', false);
  list := navDict.GetList('rdf:li', false);
  for i := 0 to list.Count - 1 do
  begin
    navDict := TIEDictionary(list[i]).GetDictionary('#content', false);
    memo1.lines.add( navDict.GetString('#text', false) );
  end;
end;
Nigel 
Xequte Software
www.imageen.com