diff options
| author | jhurst <jhurst@cinecert.com> | 2016-12-07 18:11:32 +0000 |
|---|---|---|
| committer | jhurst <> | 2016-12-07 18:11:32 +0000 |
| commit | dec4ef68baee633aac30f4b3e0aab6553c22f967 (patch) | |
| tree | dc4f1bbdc6023604ec380393eebd1aebaae3236d /src/KM_xml.h | |
| parent | 74e6b1105dffe52c6f347d723507ab346eabbb5a (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.h | 72 |
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_ |
