Implemented J2K desc to/from MD
[asdcplib.git] / src / KM_xml.h
index 0f8ba3cd553741ebd3e972ed1528a40822bb1b2c..120857c53f8d05cff4cc2fbbe948402ff2d495be 100644 (file)
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2005-2011, John Hurst
+Copyright (c) 2005-2015, John Hurst
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -35,15 +35,13 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 #include <KM_util.h>
 #include <list>
+#include <set>
 #include <string>
 
 namespace Kumu
 {
   class XMLElement;
 
-  // Return true if the given string contains an XML document (or the start of one).
-  bool StringIsXML(const char* document, ui32_t len = 0);
-
   //
   struct NVPair
   {
@@ -109,6 +107,10 @@ namespace Kumu
       bool        ParseString(const ByteString& document);
       bool        ParseString(const std::string& document);
 
+      bool        ParseFirstFromString(const char* document, ui32_t doc_len);
+      bool        ParseFirstFromString(const ByteString& document);
+      bool        ParseFirstFromString(const std::string& document);
+
       // building
       void        SetName(const char* name);
       void        SetBody(const std::string& value);
@@ -142,6 +144,77 @@ namespace Kumu
       void        DeleteChild(const XMLElement* element);
       void        ForgetChild(const XMLElement* element);
     };
+
+  //
+  template <class VisitorType>
+    bool
+    apply_visitor(const XMLElement& element, VisitorType& visitor)
+    {
+      const ElementList& l = element.GetChildren();
+      ElementList::const_iterator i;
+      
+      for ( i = l.begin(); i != l.end(); ++i )
+       {
+         if ( ! visitor.Element(**i) )
+           {
+             return false;
+           }
+
+         if ( ! apply_visitor(**i, visitor) )
+           {
+             return false;
+           }
+       }
+
+      return true;
+    }
+
+  //
+  class AttributeVisitor
+  {
+    std::string attr_name;
+
+  public:
+  AttributeVisitor(const std::string& n) : attr_name(n) {}
+    std::set<std::string> value_list;
+
+    bool Element(const XMLElement& e)
+    {
+      const AttributeList& l = e.GetAttributes();
+      AttributeList::const_iterator i;
+      for ( i = l.begin(); i != l.end(); ++i )
+       {
+         if ( i->name == attr_name )
+           {
+             value_list.insert(i->value);
+           }
+       }
+
+      return true;
+    }
+  };
+
+  //
+  class ElementVisitor
+  {
+    std::string element_name;
+
+  public:
+  ElementVisitor(const std::string& n) : element_name(n) {}
+    std::set<std::string> value_list;
+
+    bool Element(const XMLElement& e)
+    {
+      if ( e.GetBody() == element_name )
+       {
+         value_list.insert(e.GetBody());
+       }
+
+      return true;
+    }
+  };
+
 } // namespace Kumu
 
 #endif // _KM_XML_H_