#ifndef DYNAMIC_DEPTH_INTERNAL_XMPMETA_XML_SEARCH_H_  // NOLINT
#define DYNAMIC_DEPTH_INTERNAL_XMPMETA_XML_SEARCH_H_  // NOLINT

#include <libxml/tree.h>

// Performs searches an XML tree.
namespace dynamic_depth {
namespace xmpmeta {
namespace xml {

// Depth-first search on the nodes in this XML doc.
// Performs Depth first search on the child XML elements in order.
// Returns the first child element with a matching node name. If not found,
// returns a null pointer.
xmlNodePtr DepthFirstSearch(const xmlDocPtr parent, const char* name);

// Returns the first child element with a matching prefix and name.
// If prefix is null or empty, this has the same effect as the method abouve.
// Otherwise, the resulting node's namespace and its name must not be null.
xmlNodePtr DepthFirstSearch(const xmlDocPtr parent, const char* prefix,
                            const char* name);

// Depth-first search on the parent, for a child element with the given name.
// The element name excludes its prefix.
// Returns a null pointer if no matching element is found.
xmlNodePtr DepthFirstSearch(const xmlNodePtr parent, const char* name);

// Returns the first child element with a matching prefix and name.
// If prefix is null or empty, this has the same effect as the method abouve.
// Otherwise, the resulting node's namespace and its name must not be null.
xmlNodePtr DepthFirstSearch(const xmlNodePtr parent, const char* prefix,
                            const char* name);

}  // namespace xml
}  // namespace xmpmeta
}  // namespace dynamic_depth

#endif // DYNAMIC_DEPTH_INTERNAL_XMPMETA_XML_SEARCH_H_  // NOLINT