Sample code for 30+ languages & platforms
Tcl

Extract XMP MetaData as XML

See more XMP Examples

Demonstrates how to open a JPG or TIF image file and extract the XMP metadata as XML.

Chilkat Tcl Downloads

Tcl

load ./chilkat.dll

set success 0

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

set xmp [new_CkXmp]

# Load a JPG or TIF image file.
# Sample JPG's with XMP metadata may be found at:
# https://www.chilkatsoft.com/testData/xmp/sample1.jpg
# https://www.chilkatsoft.com/testData/xmp/sample2.jpg
# https://www.chilkatsoft.com/testData/xmp/sample3.jpg
set success [CkXmp_LoadAppFile $xmp "qa_data/xmp/sample1.jpg"]
if {$success != 1} then {
    puts [CkXmp_lastErrorText $xmp]
    delete_CkXmp $xmp
    exit
}

puts "Num embedded XMP docs: [CkXmp_get_NumEmbedded $xmp]"

# Assuming there is at least one, get the 1st.
# (There is typically never more than one, but theoretically it's possible.)
# xml is a CkXml
set xml [CkXmp_GetEmbedded $xmp 0]
if {[CkXmp_get_LastMethodSuccess $xmp] == 0} then {
    puts "No XMP metadata found."
    delete_CkXmp $xmp
    exit
}

puts [CkXml_getXml $xml]

# Sample output:

# <?xml version="1.0" encoding="utf-8"?>
# <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP toolkit 3.0-28, framework 1.6">
#     <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:iX="http://ns.adobe.com/iX/1.0/">
#         <rdf:Description rdf:about="uuid:0f410648-9396-11d9-bb8e-a67e6693b6e9" xmlns:xmpPLUS="XMP Photographic Licensing Universal System (xmpPLUS, http://ns.adobe.com/xap/1.0/PLUS/)">
#             <xmpPLUS:CreditLineReq>False</xmpPLUS:CreditLineReq>
#             <xmpPLUS:ReuseAllowed>False</xmpPLUS:ReuseAllowed>
#         </rdf:Description>
#         <rdf:Description rdf:about="uuid:0f410648-9396-11d9-bb8e-a67e6693b6e9" xmlns:Iptc4xmpCore="http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/">
#             <Iptc4xmpCore:IntellectualGenre>Profile</Iptc4xmpCore:IntellectualGenre>
#             <Iptc4xmpCore:Location>Lake Superior</Iptc4xmpCore:Location>
#             <Iptc4xmpCore:CountryCode>US</Iptc4xmpCore:CountryCode>
#             <Iptc4xmpCore:CreatorContactInfo rdf:parseType="Resource">
#                 <Iptc4xmpCore:CiAdrExtadr>John Doe Photography, 123 Maple Lane</Iptc4xmpCore:CiAdrExtadr>
#                 <Iptc4xmpCore:CiAdrCity>Champaign</Iptc4xmpCore:CiAdrCity>
#                 <Iptc4xmpCore:CiAdrRegion>Illinois</Iptc4xmpCore:CiAdrRegion>
#                 <Iptc4xmpCore:CiAdrPcode>61820</Iptc4xmpCore:CiAdrPcode>
#                 <Iptc4xmpCore:CiAdrCtry>USA</Iptc4xmpCore:CiAdrCtry>
#                 <Iptc4xmpCore:CiTelWork>+1 (217) 1234567</Iptc4xmpCore:CiTelWork>
#                 <Iptc4xmpCore:CiEmailWork>john@doe.com</Iptc4xmpCore:CiEmailWork>
#                 <Iptc4xmpCore:CiUrlWork>www.doe.com</Iptc4xmpCore:CiUrlWork>
#             </Iptc4xmpCore:CreatorContactInfo>
#             <Iptc4xmpCore:SubjectCode>
#                 <rdf:Bag>
#                     <rdf:li>14024001</rdf:li>
#                 </rdf:Bag>
#             </Iptc4xmpCore:SubjectCode>
#             <Iptc4xmpCore:Scene>
#                 <rdf:Bag>
#                     <rdf:li>012300</rdf:li>
#                 </rdf:Bag>
#             </Iptc4xmpCore:Scene>
#         </rdf:Description>
#         <rdf:Description rdf:about="uuid:0f410648-9396-11d9-bb8e-a67e6693b6e9" xmlns:exif="http://ns.adobe.com/exif/1.0/">
#             <exif:ColorSpace>1</exif:ColorSpace>
#             <exif:PixelXDimension>288</exif:PixelXDimension>
#             <exif:PixelYDimension>432</exif:PixelYDimension>
#         </rdf:Description>
#         <rdf:Description rdf:about="uuid:0f410648-9396-11d9-bb8e-a67e6693b6e9" xmlns:pdf="http://ns.adobe.com/pdf/1.3/"/>
#         <rdf:Description rdf:about="uuid:0f410648-9396-11d9-bb8e-a67e6693b6e9" xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/">
#             <photoshop:AuthorsPosition>Photographer</photoshop:AuthorsPosition>
#             <photoshop:Headline>Young boy yelling</photoshop:Headline>
#             <photoshop:CaptionWriter>John Doe</photoshop:CaptionWriter>
#             <photoshop:DateCreated>2004-08-19</photoshop:DateCreated>
#             <photoshop:City>Marquette</photoshop:City>
#             <photoshop:State>Michigan</photoshop:State>
#             <photoshop:Country>United States</photoshop:Country>
#             <photoshop:TransmissionReference>PO 34567</photoshop:TransmissionReference>
#             <photoshop:Instructions>Original RAW capture Nikon D2X, Adobe RGB 1998.</photoshop:Instructions>
#             <photoshop:Credit>John Doe Photography</photoshop:Credit>
#             <photoshop:Source>John Doe Photography</photoshop:Source>
#             <photoshop:History/>
#         </rdf:Description>
#         <rdf:Description rdf:about="uuid:0f410648-9396-11d9-bb8e-a67e6693b6e9" xmlns:tiff="http://ns.adobe.com/tiff/1.0/">
#             <tiff:XResolution>72/1</tiff:XResolution>
#             <tiff:YResolution>72/1</tiff:YResolution>
#             <tiff:ResolutionUnit>2</tiff:ResolutionUnit>
#             <tiff:Orientation>1</tiff:Orientation>
#         </rdf:Description>
#         <rdf:Description rdf:about="uuid:0f410648-9396-11d9-bb8e-a67e6693b6e9" xmlns:xap="http://ns.adobe.com/xap/1.0/">
#             <xap:CreateDate>2005-03-13T02:02:29-06:00</xap:CreateDate>
#             <xap:ModifyDate>2005-03-13T02:02:29-06:00</xap:ModifyDate>
#             <xap:MetadataDate>2005-03-13T02:02:29-06:00</xap:MetadataDate>
#             <xap:CreatorTool>Adobe Photoshop CS Windows</xap:CreatorTool>
#         </rdf:Description>
#         <rdf:Description rdf:about="uuid:0f410648-9396-11d9-bb8e-a67e6693b6e9" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xapMM="http://ns.adobe.com/xap/1.0/mm/">
#             <xapMM:DerivedFrom rdf:parseType="Resource">
#                 <stRef:instanceID>uuid:f5b64171-9394-11d9-bb8e-a67e6693b6e9</stRef:instanceID>
#                 <stRef:documentID>adobe:docid:photoshop:e4d002a4-9392-11d9-bb8e-a67e6693b6e9</stRef:documentID>
#             </xapMM:DerivedFrom>
#             <xapMM:DocumentID>adobe:docid:photoshop:0f410647-9396-11d9-bb8e-a67e6693b6e9</xapMM:DocumentID>
#         </rdf:Description>
#         <rdf:Description rdf:about="uuid:0f410648-9396-11d9-bb8e-a67e6693b6e9" xmlns:xapRights="http://ns.adobe.com/xap/1.0/rights/">
#             <xapRights:Marked>True</xapRights:Marked>
#             <xapRights:WebStatement>http://www.doe.com</xapRights:WebStatement>
#             <xapRights:RightsUsageTerms>
#                 <rdf:Alt>
#                     <rdf:li xml:lang="x-default">For consideration only, no reproduction without prior permission</rdf:li>
#                 </rdf:Alt>
#             </xapRights:RightsUsageTerms>
#             <xapRights:UsageTerms>
#                 <rdf:Alt>
#                     <rdf:li xml:lang="x-default">For consideration only, no reproduction without prior permission</rdf:li>
#                 </rdf:Alt>
#             </xapRights:UsageTerms>
#         </rdf:Description>
#         <rdf:Description rdf:about="uuid:0f410648-9396-11d9-bb8e-a67e6693b6e9" xmlns:dc="http://purl.org/dc/elements/1.1/">
#             <dc:format>image/jpeg</dc:format>
#             <dc:description>
#                 <rdf:Alt>
#                     <rdf:li xml:lang="x-default">Three year old African American boy yells with joy on beach during vacation.</rdf:li>
#                 </rdf:Alt>
#             </dc:description>
#             <dc:title>
#                 <rdf:Alt>
#                     <rdf:li xml:lang="x-default">20040819_pe_014578d.nef</rdf:li>
#                 </rdf:Alt>
#             </dc:title>
#             <dc:rights>
#                 <rdf:Alt>
#                     <rdf:li xml:lang="x-default">�2004 John Doe, all rights reserved</rdf:li>
#                 </rdf:Alt>
#             </dc:rights>
#             <dc:creator>
#                 <rdf:Seq>
#                     <rdf:li>John Doe</rdf:li>
#                 </rdf:Seq>
#             </dc:creator>
#             <dc:subject>
#                 <rdf:Bag>
#                     <rdf:li>boy</rdf:li>
#                     <rdf:li>gender</rdf:li>
#                     <rdf:li>human beings</rdf:li>
#                     <rdf:li>humans</rdf:li>
#                     <rdf:li>lad</rdf:li>
#                     <rdf:li>male</rdf:li>
#                     <rdf:li>people</rdf:li>
#                     <rdf:li>3-12 years old</rdf:li>
#                     <rdf:li>age</rdf:li>
#                     <rdf:li>child</rdf:li>
#                     <rdf:li>youth</rdf:li>
#                     <rdf:li>african american</rdf:li>
#                     <rdf:li>african-american</rdf:li>
#                     <rdf:li>black</rdf:li>
#                     <rdf:li>ethnic</rdf:li>
#                     <rdf:li>ethnicity</rdf:li>
#                     <rdf:li>people of color</rdf:li>
#                     <rdf:li>race</rdf:li>
#                     <rdf:li>beach</rdf:li>
#                     <rdf:li>nature</rdf:li>
#                     <rdf:li>scenery</rdf:li>
#                     <rdf:li>emotion</rdf:li>
#                     <rdf:li>emotional</rdf:li>
#                     <rdf:li>emotions</rdf:li>
#                     <rdf:li>happiness</rdf:li>
#                     <rdf:li>happy</rdf:li>
#                     <rdf:li>joy</rdf:li>
#                     <rdf:li>joyful</rdf:li>
#                     <rdf:li>joyous</rdf:li>
#                 </rdf:Bag>
#             </dc:subject>
#         </rdf:Description>
#     </rdf:RDF>
# </x:xmpmeta>

# You can generate parsing code using Chilkat's online tool : 
# Generate Parsing Code from XML

set x_xmpmeta_xmlns_x [CkXml_getAttrValue $xml "xmlns:x"]
set x_xmpmeta_x_xmptk [CkXml_getAttrValue $xml "x:xmptk"]
set rdf_RDF_xmlns_rdf [CkXml_chilkatPath $xml "rdf:RDF|(xmlns:rdf)"]
set rdf_RDF_xmlns_iX [CkXml_chilkatPath $xml "rdf:RDF|(xmlns:iX)"]
set i 0
set count_i [CkXml_NumChildrenHavingTag $xml "rdf:RDF|rdf:Description"]
while {$i < $count_i} {
    CkXml_put_I $xml $i
    set rdf_Description_rdf_about [CkXml_chilkatPath $xml "rdf:RDF|rdf:Description[i]|(rdf:about)"]
    set rdf_Description_xmlns_xmpPLUS [CkXml_chilkatPath $xml "rdf:RDF|rdf:Description[i]|(xmlns:xmpPLUS)"]
    set rdf_Description_xmlns_Iptc4xmpCore [CkXml_chilkatPath $xml "rdf:RDF|rdf:Description[i]|(xmlns:Iptc4xmpCore)"]
    set rdf_Description_xmlns_exif [CkXml_chilkatPath $xml "rdf:RDF|rdf:Description[i]|(xmlns:exif)"]
    set rdf_Description_xmlns_pdf [CkXml_chilkatPath $xml "rdf:RDF|rdf:Description[i]|(xmlns:pdf)"]
    set rdf_Description_xmlns_photoshop [CkXml_chilkatPath $xml "rdf:RDF|rdf:Description[i]|(xmlns:photoshop)"]
    set rdf_Description_xmlns_tiff [CkXml_chilkatPath $xml "rdf:RDF|rdf:Description[i]|(xmlns:tiff)"]
    set rdf_Description_xmlns_xap [CkXml_chilkatPath $xml "rdf:RDF|rdf:Description[i]|(xmlns:xap)"]
    set rdf_Description_xmlns_stRef [CkXml_chilkatPath $xml "rdf:RDF|rdf:Description[i]|(xmlns:stRef)"]
    set rdf_Description_xmlns_xapMM [CkXml_chilkatPath $xml "rdf:RDF|rdf:Description[i]|(xmlns:xapMM)"]
    set rdf_Description_xmlns_xapRights [CkXml_chilkatPath $xml "rdf:RDF|rdf:Description[i]|(xmlns:xapRights)"]
    set rdf_Description_xmlns_dc [CkXml_chilkatPath $xml "rdf:RDF|rdf:Description[i]|(xmlns:dc)"]
    set xmpPLUS_CreditLineReq [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|xmpPLUS:CreditLineReq"]
    set xmpPLUS_ReuseAllowed [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|xmpPLUS:ReuseAllowed"]
    set Iptc4xmpCore_IntellectualGenre [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|Iptc4xmpCore:IntellectualGenre"]
    set Iptc4xmpCore_Location [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|Iptc4xmpCore:Location"]
    set Iptc4xmpCore_CountryCode [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|Iptc4xmpCore:CountryCode"]
    set Iptc4xmpCore_CreatorContactInfo_rdf_parseType [CkXml_chilkatPath $xml "rdf:RDF|rdf:Description[i]|Iptc4xmpCore:CreatorContactInfo|(rdf:parseType)"]
    set Iptc4xmpCore_CiAdrExtadr [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|Iptc4xmpCore:CreatorContactInfo|Iptc4xmpCore:CiAdrExtadr"]
    set Iptc4xmpCore_CiAdrCity [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|Iptc4xmpCore:CreatorContactInfo|Iptc4xmpCore:CiAdrCity"]
    set Iptc4xmpCore_CiAdrRegion [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|Iptc4xmpCore:CreatorContactInfo|Iptc4xmpCore:CiAdrRegion"]
    set Iptc4xmpCore_CiAdrPcode [CkXml_GetChildIntValue $xml "rdf:RDF|rdf:Description[i]|Iptc4xmpCore:CreatorContactInfo|Iptc4xmpCore:CiAdrPcode"]
    set Iptc4xmpCore_CiAdrCtry [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|Iptc4xmpCore:CreatorContactInfo|Iptc4xmpCore:CiAdrCtry"]
    set Iptc4xmpCore_CiTelWork [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|Iptc4xmpCore:CreatorContactInfo|Iptc4xmpCore:CiTelWork"]
    set Iptc4xmpCore_CiEmailWork [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|Iptc4xmpCore:CreatorContactInfo|Iptc4xmpCore:CiEmailWork"]
    set Iptc4xmpCore_CiUrlWork [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|Iptc4xmpCore:CreatorContactInfo|Iptc4xmpCore:CiUrlWork"]
    set rdf_li [CkXml_GetChildIntValue $xml "rdf:RDF|rdf:Description[i]|Iptc4xmpCore:SubjectCode|rdf:Bag|rdf:li"]
    set rdf_li [CkXml_GetChildIntValue $xml "rdf:RDF|rdf:Description[i]|Iptc4xmpCore:Scene|rdf:Bag|rdf:li"]
    set exif_ColorSpace [CkXml_GetChildIntValue $xml "rdf:RDF|rdf:Description[i]|exif:ColorSpace"]
    set exif_PixelXDimension [CkXml_GetChildIntValue $xml "rdf:RDF|rdf:Description[i]|exif:PixelXDimension"]
    set exif_PixelYDimension [CkXml_GetChildIntValue $xml "rdf:RDF|rdf:Description[i]|exif:PixelYDimension"]
    set photoshop_AuthorsPosition [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|photoshop:AuthorsPosition"]
    set photoshop_Headline [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|photoshop:Headline"]
    set photoshop_CaptionWriter [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|photoshop:CaptionWriter"]
    set photoshop_DateCreated [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|photoshop:DateCreated"]
    set photoshop_City [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|photoshop:City"]
    set photoshop_State [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|photoshop:State"]
    set photoshop_Country [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|photoshop:Country"]
    set photoshop_TransmissionReference [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|photoshop:TransmissionReference"]
    set photoshop_Instructions [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|photoshop:Instructions"]
    set photoshop_Credit [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|photoshop:Credit"]
    set photoshop_Source [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|photoshop:Source"]
    set tiff_XResolution [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|tiff:XResolution"]
    set tiff_YResolution [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|tiff:YResolution"]
    set tiff_ResolutionUnit [CkXml_GetChildIntValue $xml "rdf:RDF|rdf:Description[i]|tiff:ResolutionUnit"]
    set tiff_Orientation [CkXml_GetChildIntValue $xml "rdf:RDF|rdf:Description[i]|tiff:Orientation"]
    set xap_CreateDate [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|xap:CreateDate"]
    set xap_ModifyDate [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|xap:ModifyDate"]
    set xap_MetadataDate [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|xap:MetadataDate"]
    set xap_CreatorTool [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|xap:CreatorTool"]
    set xapMM_DerivedFrom_rdf_parseType [CkXml_chilkatPath $xml "rdf:RDF|rdf:Description[i]|xapMM:DerivedFrom|(rdf:parseType)"]
    set stRef_instanceID [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|xapMM:DerivedFrom|stRef:instanceID"]
    set stRef_documentID [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|xapMM:DerivedFrom|stRef:documentID"]
    set xapMM_DocumentID [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|xapMM:DocumentID"]
    set xapRights_Marked [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|xapRights:Marked"]
    set xapRights_WebStatement [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|xapRights:WebStatement"]
    set rdf_li_xml_lang [CkXml_chilkatPath $xml "rdf:RDF|rdf:Description[i]|xapRights:RightsUsageTerms|rdf:Alt|rdf:li|(xml:lang)"]
    set strRdf_li [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|xapRights:RightsUsageTerms|rdf:Alt|rdf:li"]
    set rdf_li_xml_lang [CkXml_chilkatPath $xml "rdf:RDF|rdf:Description[i]|xapRights:UsageTerms|rdf:Alt|rdf:li|(xml:lang)"]
    set strRdf_li [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|xapRights:UsageTerms|rdf:Alt|rdf:li"]
    set dc_format [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|dc:format"]
    set rdf_li_xml_lang [CkXml_chilkatPath $xml "rdf:RDF|rdf:Description[i]|dc:description|rdf:Alt|rdf:li|(xml:lang)"]
    set strRdf_li [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|dc:description|rdf:Alt|rdf:li"]
    set rdf_li_xml_lang [CkXml_chilkatPath $xml "rdf:RDF|rdf:Description[i]|dc:title|rdf:Alt|rdf:li|(xml:lang)"]
    set strRdf_li [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|dc:title|rdf:Alt|rdf:li"]
    set rdf_li_xml_lang [CkXml_chilkatPath $xml "rdf:RDF|rdf:Description[i]|dc:rights|rdf:Alt|rdf:li|(xml:lang)"]
    set strRdf_li [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|dc:rights|rdf:Alt|rdf:li"]
    set strRdf_li [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|dc:creator|rdf:Seq|rdf:li"]
    set j 0
    set count_j [CkXml_NumChildrenHavingTag $xml "rdf:RDF|rdf:Description[i]|dc:subject|rdf:Bag|rdf:li"]
    while {$j < $count_j} {
        CkXml_put_J $xml $j
        set strRdf_li [CkXml_getChildContent $xml "rdf:RDF|rdf:Description[i]|dc:subject|rdf:Bag|rdf:li[j]"]
        set j [expr $j + 1]
    }
    set i [expr $i + 1]
}

delete_CkXml $xml


delete_CkXmp $xmp