/*
-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
#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
{
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);
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_