我使用的libxml2在一个XML文件中的数据进行编码。 我的数据包括类似“<”和“>”标记。 当它被转换成XML这些标签也被转换为“&LT”和“&GT”。 有什么办法来解决这个问题。 我想用这些标签的XML节点,而解码该XML文件,所以CDATA是不是这个问题的解决方案。 请给这方面的任何解决方案。 谢谢。
示例代码:
xmlNewChild(node, NULL, (xmlChar *)"ADDRESS", (xmlChar *)"<street>Park Street</street><city>kolkata</city>");
and output of above code is:
<person>
<ADDRESS><street>Park Street</street><city>Kolkata</city></ADDRESS>
如果你想有一个字符串作为XML来处理,那么你就应该分析它,并获得xmlDoc
从它,使用xmlReadMemory 。 这可能是较大的字符串使用,但通常文档使用单步指令,像在勒夫的回答建造。 在这里,我提出xmlAddChildFromString
功能做的东西在一个字符串的方式。
#include <stdio.h>
#include <string.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
/// 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, "<a>");
strcat(newNodeStrWrapped, newNodeStr);
strcat(newNodeStrWrapped, "</a>");
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,
"<street>Park Street</street><city>kolkata</city>");
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 = "<a><b><c>blah</c></b></a>";
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文本(可能包含多个元素)到现有节点(感谢纳扎尔和nwellnhof了一个答案,并从我的问题我引荐( 注入字符串转换成XML节点没有内容转义 )这一个):
std::string xml = "<a>" + str + "</a>";
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)增加了一个围绕元件(<A> ... <A />),解析使用xmlParseInNodeContext字符串,然后添加新节点的子节点到父。 添加新节点的孩子,而不是新的节点,以避免<一> ... <一/>在最后的XML是很重要的。