如何在libxml2中添加由string构造的xml节点

我使用Libxml2来编码xml文件中的数据。 我的数据包含“”等标签。 当它转换为xml时,这些标签也会转换为“&lt”和“&gt”。 有没有办法解决这个问题。 我想在解码该xml文件时将这些标记用作xml节点,因此CDATA不是解决此问题的方法。 请为此提供任何解决方案。 谢谢。

示例代码:

xmlNewChild(node, NULL, (xmlChar *)"ADDRESS", (xmlChar *)"Park Streetkolkata"); and output of above code is:  
<street>Park Street</street><city>Kolkata</city>

如果您希望将字符串视为xml,则应使用xmlReadMemory解析它并从中获取xmlDoc 。 它可用于较大的字符串,但通常使用单步指令构建文档,如Joachim的答案。 在这里,我提出了xmlAddChildFromString函数来以字符串方式执行这些操作。

 #include  #include  #include  #include  /// Returns 0 on failure, 1 otherwise int xmlAddChildFromString(xmlNodePtr parent, xmlChar *newNodeStr) { int rv = 0; xmlChar *newNodeStrWrapped = calloc(strlen(newNodeStr) + 10, 1); if (!newNodeStrWrapped) return 0; strcat(newNodeStrWrapped, ""); strcat(newNodeStrWrapped, newNodeStr); strcat(newNodeStrWrapped, ""); xmlDocPtr newDoc = xmlReadMemory( newNodeStrWrapped, strlen(newNodeStrWrapped), NULL, NULL, 0); free(newNodeStrWrapped); if (!newDoc) return 0; xmlNodePtr newNode = xmlDocCopyNode( xmlDocGetRootElement(newDoc), parent->doc, 1); xmlFreeDoc(newDoc); if (!newNode) return 0; xmlNodePtr addedNode = xmlAddChildList(parent, newNode->children); if (!addedNode) { xmlFreeNode(newNode); return 0; } newNode->children = NULL; // Thanks to milaniez newNode->last = NULL; // for fixing xmlFreeNode(newNode); // the memory leak. return 1; } int main(int argc, char **argv) { xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0"); xmlNodePtr root = xmlNewNode(NULL, BAD_CAST "root"); xmlDocSetRootElement(doc, root); xmlAddChildFromString(root, "Park Streetkolkata"); xmlDocDump(stdout, doc); xmlFreeDoc(doc); return(0); } 

您必须在链中调用xmlNewChild ,一次调用父节点,并为每个子节点调用一次:

 xmlNodePtr *addressNode = xmlNewChild(node, NULL, (xmlChar *) "address", NULL); xmlNewChild(addressNode, NULL, (xmlChar *) "street", "Park Street"); xmlNewChild(addressNode, NULL, (xmlChar *) "city", "Koltaka"); 

您可以尝试使用函数xmlParseInNodeContext。 它允许您在父节点的上下文中解析原始XML,并构造可以附加到父节点的节点。

例如:

 const char * xml = "blah"; xmlNodePtr new_node = NULL; // we assume that 'parent' node is already defined xmlParseInNodeContext(parent, xml, strlen(xml), 0, &new_node); if (new_node) xmlAddChild(parent, new_node); 

我现在使用以下代码将XML文本(可能包含多个元素)注入到现有节点中(感谢Nazar和nwellnhof的一个答案,并从我的问题中引用了我( 将字符串注入到没有内容转义的XML节点中 )到这一个):

 std::string xml = "" + str + ""; xmlNodePtr pNewNode = nullptr; xmlParseInNodeContext(pParentNode, xml.c_str(), (int)xml.length(), 0, &pNewNode); if (pNewNode != nullptr) { // add new xml node children to parent xmlNode *pChild = pNewNode->children; while (pChild != nullptr) { xmlAddChild(pParentNode, xmlCopyNode(pChild, 1)); pChild = pChild->next; } xmlFreeNode(pNewNode); } 

它需要字符串(str)添加一个周围的元素( /> ),使用xmlParseInNodeContext解析字符串,然后将新节点的子节点添加到父节点。 添加新节点的子节点而不是新节点非常重要,以避免在最终XML中使用