Anything relating to std::pair smells like curry. Seriously, avoid it, it helps with readablity. Use a struct or dare i say it a custom object.
However after taking a look at the rest of the code, you're using a pair so you can insert into the map. Use operator, it reads better.
tagNode.properties.insert(std::pair<std::string, std::string>(propertyKey, element.substr(start, cursor - start)));
tagNode.properties[propertyKey] = element.substr(start, cursor - start);
Only problem is one more copy and a possible call to the default constructor. Just so you know I support what you're doing m8's, just too lazy after work to help out