return pos->second;
}
+xmlNodePtr MakePluginNode(xmlNodePtr node, const std::string& tag_name) {
+ xmlNodePtr ret_node = nullptr;
+ if (tag_name == reinterpret_cast<const char*>(node->name)) {
+ ret_node = xmlCopyNode(node, 1);
+ return ret_node;
+ }
+
+ for (xmlNodePtr child = xmlFirstElementChild(node);
+ child != nullptr; child = xmlNextElementSibling(child)) {
+ xmlNodePtr child_node = MakePluginNode(child, tag_name);
+ if (!child_node)
+ continue;
+ if (!ret_node)
+ ret_node = xmlCopyNode(node, 0);
+ xmlAddChild(ret_node, child_node);
+ }
+ return ret_node;
+}
+
xmlDocPtr TagPlugin::CreateDocPtrForPlugin(xmlDocPtr doc_ptr,
const std::string& tag_name) const {
// Make copy of document and root node
return nullptr;
}
xmlDocPtr plugin_doc_ptr = xmlCopyDoc(doc_ptr, 0);
- xmlNodePtr plugin_root_node = xmlCopyNode(root_node, 0);
- xmlDocSetRootElement(plugin_doc_ptr, plugin_root_node);
-
- // Append elements that matches the tag name to new doc
- for (xmlNodePtr child = xmlFirstElementChild(root_node);
- child != nullptr; child = xmlNextElementSibling(child)) {
- if (tag_name == reinterpret_cast<const char*>(child->name)) {
- xmlAddChild(plugin_root_node, xmlCopyNode(child, 1));
- }
+ xmlNodePtr plugin_root_node = MakePluginNode(root_node, tag_name);
+ if (!plugin_root_node) {
+ LOG(ERROR) << "make plugin node fail";
+ return nullptr;
}
+ xmlDocSetRootElement(plugin_doc_ptr, plugin_root_node);
xmlSetTreeDoc(plugin_root_node, plugin_doc_ptr);
return plugin_doc_ptr;
}