summaryrefslogtreecommitdiff
path: root/src/KM_xml.h
diff options
context:
space:
mode:
authorjhurst <jhurst@cinecert.com>2016-12-07 18:11:32 +0000
committerjhurst <>2016-12-07 18:11:32 +0000
commitdec4ef68baee633aac30f4b3e0aab6553c22f967 (patch)
treedc4f1bbdc6023604ec380393eebd1aebaae3236d /src/KM_xml.h
parent74e6b1105dffe52c6f347d723507ab346eabbb5a (diff)
o Improved IMSC-1 profile detection. May not yet be perfect, experimentation
encouraged! o Refactored XML element & attribute visitation to KM_xml.h o Added km_join() template to KM_util.h
Diffstat (limited to 'src/KM_xml.h')
-rw-r--r--src/KM_xml.h72
1 files changed, 72 insertions, 0 deletions
diff --git a/src/KM_xml.h b/src/KM_xml.h
index 0c84e56..120857c 100644
--- a/src/KM_xml.h
+++ b/src/KM_xml.h
@@ -35,6 +35,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <KM_util.h>
#include <list>
+#include <set>
#include <string>
namespace Kumu
@@ -143,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_