X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2FKM_xml.h;h=120857c53f8d05cff4cc2fbbe948402ff2d495be;hb=dec4ef68baee633aac30f4b3e0aab6553c22f967;hp=0c84e563c17035f098c4f96dc6b5a6896e83c187;hpb=74e6b1105dffe52c6f347d723507ab346eabbb5a;p=asdcplib.git 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 #include +#include #include namespace Kumu @@ -143,6 +144,77 @@ namespace Kumu void DeleteChild(const XMLElement* element); void ForgetChild(const XMLElement* element); }; + + // + template + 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 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 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_