Read an XMP packet from a file, parse it and print all (known) properties.

// ***************************************************************** -*- C++ -*-
* Copyright (C) 2004-2021 Exiv2 authors
* This program is part of the Exiv2 distribution.
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, 5th Floor, Boston, MA 02110-1301 USA.
// xmpparse.cpp
// Read an XMP packet from a file, parse it and print all (known) properties.
#include <exiv2/exiv2.hpp>
#include <string>
#include <iostream>
#include <iomanip>
int main(int argc, char* const argv[])
try {
if (argc != 2) {
std::cout << "Usage: " << argv[0] << " file\n";
return 1;
std::string xmpPacket;
xmpPacket.assign(reinterpret_cast<char*>(buf.pData_), buf.size_);
Exiv2::XmpData xmpData;
if (0 != Exiv2::XmpParser::decode(xmpData, xmpPacket)) {
std::string error(argv[1]);
error += ": Failed to parse file contents (XMP packet)";
throw Exiv2::Error(Exiv2::kerErrorMessage, error);
if (xmpData.empty()) {
std::string error(argv[1]);
error += ": No XMP properties found in the XMP packet";
throw Exiv2::Error(Exiv2::kerErrorMessage, error);
md != xmpData.end(); ++md) {
std::cout << std::setfill(' ') << std::left
<< std::setw(44)
<< md->key() << " "
<< std::setw(9) << std::setfill(' ') << std::left
<< md->typeName() << " "
<< std::dec << std::setw(3)
<< std::setfill(' ') << std::right
<< md->count() << " "
<< std::dec << md->toString()
<< std::endl;
return 0;
catch (Exiv2::AnyError& e) {
std::cout << "Caught Exiv2 exception '" << e << "'\n";
return -1;
byte * pData_
Pointer to the buffer, 0 if none has been allocated.
Definition: types.hpp:258
static bool initialize(XmpParser::XmpLockFct xmpLockFct=0, void *pLockData=0)
Initialize the XMP Toolkit.
Error class interface. Allows the definition and use of a hierarchy of error classes which can all be...
Definition: error.hpp:174
Utility class containing a character array. All it does is to take care of memory allocation and dele...
Definition: types.hpp:193
long size_
The current size of the buffer.
Definition: types.hpp:260
static int decode(XmpData &xmpData, const std::string &xmpPacket)
Decode XMP metadata from an XMP packet xmpPacket into xmpData. The format of the XMP packet must foll...
A container for XMP data. This is a top-level class of the Exiv2 library.
Definition: xmp_exiv2.hpp:166
iterator begin()
Begin of the metadata.
bool empty() const
Return true if there is no XMP metadata.
static void terminate()
Terminate the XMP Toolkit and unregister custom namespaces.
iterator end()
End of the metadata.
XmpMetadata::const_iterator const_iterator
XmpMetadata const iterator type.
Definition: xmp_exiv2.hpp:174
BasicError< char > Error
Error class used for exceptions (std::string based)
Definition: error.hpp:324
EXIV2API DataBuf readFile(const std::string &path)
Read file path into a DataBuf, which is returned.