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::AddNode(const pugi::xml_node& patch, const pugi::xpath_node& original) const { // If pos is null, append or prepend add as a child, otherwise add before or after, the default is to append as a child pugi::xml_attribute pos = patch.attribute("pos"); if (!pos || strlen(pos.value()) <= 0 || strcmp(pos.value(), "append") == 0) { pugi::xml_node::iterator start = patch.begin(); pugi::xml_node::iterator end = patch.end(); // There can not be two consecutive text nodes, so check to see if they need to be combined // If they have been we can skip the first node of the nodes to add if (CombineText(patch.first_child(), original.node().last_child(), false)) start++; for (; start != end; start++) original.node().append_copy(*start); } else if (strcmp(pos.value(), "prepend") == 0) { pugi::xml_node::iterator start = patch.begin(); pugi::xml_node::iterator end = patch.end(); // There can not be two consecutive text nodes, so check to see if they need to be combined // If they have been we can skip the last node of the nodes to add if (CombineText(patch.last_child(), original.node().first_child(), true)) end--; pugi::xml_node pos = original.node().first_child(); for (; start != end; start++) original.node().insert_copy_before(*start, pos); } else if (strcmp(pos.value(), "before") == 0) { pugi::xml_node::iterator start = patch.begin(); pugi::xml_node::iterator end = patch.end(); // There can not be two consecutive text nodes, so check to see if they need to be combined // If they have been we can skip the first node of the nodes to add if (CombineText(patch.first_child(), original.node().previous_sibling(), false)) start++; // There can not be two consecutive text nodes, so check to see if they need to be combined // If they have been we can skip the last node of the nodes to add if (CombineText(patch.last_child(), original.node(), true)) end--; for (; start != end; start++) original.parent().insert_copy_before(*start, original.node()); } else if (strcmp(pos.value(), "after") == 0) { pugi::xml_node::iterator start = patch.begin(); pugi::xml_node::iterator end = patch.end(); // There can not be two consecutive text nodes, so check to see if they need to be combined // If they have been we can skip the first node of the nodes to add if (CombineText(patch.first_child(), original.node(), false)) start++; // There can not be two consecutive text nodes, so check to see if they need to be combined // If they have been we can skip the last node of the nodes to add if (CombineText(patch.last_child(), original.node().next_sibling(), true)) end--; pugi::xml_node pos = original.node(); for (; start != end; start++) pos = original.parent().insert_copy_after(*start, pos); } }