1*a62be085SSadaf Ebrahimi #ifndef DYNAMIC_DEPTH_INTERNAL_XMPMETA_XML_UTILS_H_ // NOLINT 2*a62be085SSadaf Ebrahimi #define DYNAMIC_DEPTH_INTERNAL_XMPMETA_XML_UTILS_H_ // NOLINT 3*a62be085SSadaf Ebrahimi 4*a62be085SSadaf Ebrahimi #include <libxml/tree.h> 5*a62be085SSadaf Ebrahimi 6*a62be085SSadaf Ebrahimi #include <string> 7*a62be085SSadaf Ebrahimi 8*a62be085SSadaf Ebrahimi #include "base/port.h" 9*a62be085SSadaf Ebrahimi 10*a62be085SSadaf Ebrahimi namespace dynamic_depth { 11*a62be085SSadaf Ebrahimi namespace xmpmeta { 12*a62be085SSadaf Ebrahimi namespace xml { 13*a62be085SSadaf Ebrahimi 14*a62be085SSadaf Ebrahimi // Convenience function to convert an xmlChar* to a char* FromXmlChar(const xmlChar * in)15*a62be085SSadaf Ebrahimiinline const char* FromXmlChar(const xmlChar* in) { 16*a62be085SSadaf Ebrahimi return reinterpret_cast<const char*>(in); 17*a62be085SSadaf Ebrahimi } 18*a62be085SSadaf Ebrahimi 19*a62be085SSadaf Ebrahimi // Convenience function to convert a char* to an xmlChar*. ToXmlChar(const char * in)20*a62be085SSadaf Ebrahimiinline const xmlChar* ToXmlChar(const char* in) { 21*a62be085SSadaf Ebrahimi return reinterpret_cast<const xmlChar*>(in); 22*a62be085SSadaf Ebrahimi } 23*a62be085SSadaf Ebrahimi 24*a62be085SSadaf Ebrahimi // Returns the first rdf:Description node; null if not found. 25*a62be085SSadaf Ebrahimi xmlNodePtr GetFirstDescriptionElement(xmlDocPtr parent); 26*a62be085SSadaf Ebrahimi 27*a62be085SSadaf Ebrahimi // Returns the first rdf:Seq element found in the XML document. 28*a62be085SSadaf Ebrahimi xmlNodePtr GetFirstSeqElement(xmlDocPtr parent); 29*a62be085SSadaf Ebrahimi 30*a62be085SSadaf Ebrahimi // Returns the first rdf:Seq element found in the given node. 31*a62be085SSadaf Ebrahimi // Returns {@code parent} if that is itself an rdf:Seq node. 32*a62be085SSadaf Ebrahimi xmlNodePtr GetFirstSeqElement(xmlNodePtr parent); 33*a62be085SSadaf Ebrahimi 34*a62be085SSadaf Ebrahimi // Returns the ith (zero-indexed) rdf:li node in the given rdf:Seq node. 35*a62be085SSadaf Ebrahimi // Returns null if either of {@code index} < 0, {@code node} is null, or is 36*a62be085SSadaf Ebrahimi // not an rdf:Seq node. 37*a62be085SSadaf Ebrahimi xmlNodePtr GetElementAt(xmlNodePtr node, int index); 38*a62be085SSadaf Ebrahimi 39*a62be085SSadaf Ebrahimi // Returns the value in an rdf:li node. This is for a node whose value 40*a62be085SSadaf Ebrahimi // does not have a name, e.g. <rdf:li>value</rdf:li>. 41*a62be085SSadaf Ebrahimi // If the given rdf:li node has a nested node, it returns the string 42*a62be085SSadaf Ebrahimi // representation of the contents of those nodes, which replaces the XML 43*a62be085SSadaf Ebrahimi // tags with one whitespace character for each tag character. 44*a62be085SSadaf Ebrahimi // This is treated as undefined behavior; it is the caller's responsibility 45*a62be085SSadaf Ebrahimi // to remove any whitespace and newlines. 46*a62be085SSadaf Ebrahimi const string GetLiNodeContent(xmlNodePtr node); 47*a62be085SSadaf Ebrahimi 48*a62be085SSadaf Ebrahimi // Returns the given XML doc serialized to a string. 49*a62be085SSadaf Ebrahimi // For debugging purposes. 50*a62be085SSadaf Ebrahimi const string XmlDocToString(const xmlDocPtr doc); 51*a62be085SSadaf Ebrahimi 52*a62be085SSadaf Ebrahimi } // namespace xml 53*a62be085SSadaf Ebrahimi } // namespace xmpmeta 54*a62be085SSadaf Ebrahimi } // namespace dynamic_depth 55*a62be085SSadaf Ebrahimi 56*a62be085SSadaf Ebrahimi #endif // DYNAMIC_DEPTH_INTERNAL_XMPMETA_XML_UTILS_H_ // NOLINT 57