std::string Engine::getAttribute( const pugi::xml_document& cfg, const std::string xpath ) { const pugi::xpath_node xpnode = cfg.select_single_node(xpath.c_str()) ; DLOG(INFO) << xpath << " " << xpnode.attribute().name() << " " << xpnode.attribute().value() << std::endl ; std::string ret(xpnode.attribute().value()); if( ret.size( ) == 0 ) { throw StatMissingException( "xpath [" + xpath + "] returns no value." ) ; } return ret ; }
void XMLFile::PatchRemove(const pugi::xpath_node& original) const { // If no attribute but node then its a node, otherwise its an attribute or null if (!original.attribute() && original.node()) { pugi::xml_node parent = original.parent(); parent.remove_child(original.node()); } else if (original.attribute()) { pugi::xml_node parent = original.parent(); parent.remove_attribute(original.attribute()); } }
void XMLFile::PatchReplace(const pugi::xml_node& patch, pugi::xpath_node& original) const { // If no attribute but node then its a node, otherwise its an attribute or null if (!original.attribute() && original.node()) { pugi::xml_node parent = original.node().parent(); parent.insert_copy_before(patch.first_child(), original.node()); parent.remove_child(original.node()); } else if (original.attribute()) { original.attribute().set_value(patch.child_value()); } }
void XMLFile::PatchAdd(const pugi::xml_node& patch, pugi::xpath_node& original) const { // If not a node, log an error if (original.attribute()) { URHO3D_LOGERRORF("XML Patch failed calling Add due to not selecting a node, %s attribute was selected.", original.attribute().name()); return; } // If no type add node, if contains '@' treat as attribute pugi::xml_attribute type = patch.attribute("type"); if (!type || strlen(type.value()) <= 0) AddNode(patch, original); else if (type.value()[0] == '@') AddAttribute(patch, original); }