在不进行内容转义的情况下将字符串注入XML节点



我正在代码中生成一些xml(作为字符串),然后我想将字符串设置为现有节点的子元素(使用xmlNodeSetContent)。

问题是,xmlNodeSetContent函数或我正在使用的XML保存函数(xmlSaveFormatFileEnc)正在转义'<'和'>'字符作为'&lt;'和'&gt;'

在这种情况下,如何关闭转义?或者,我可以格式化字符串以禁用转义吗?

可能的答案:我尝试过的一种解决方案是在文本字符串周围添加相关的XML标头和主元素,然后将字符串加载为第二个XML文档。然后,我可以获取新的文档子项和/或内容,并将其添加到现有节点中。这是可行的,但我希望有一个更简单的方法。

澄清:我的程序的一部分是生成XML并仅将其作为字符串返回。我想获取这个字符串并将其注入到现有文档中。如果我使用xmlNodeSetContent,它在某种程度上是有效的,除了一些XML语法是转义的,这是我不想要的。

我现在使用以下代码将XML文本(可能包含多个元素)注入到现有节点中(感谢Nazar和nwellnhof给出的一个答案,并向我介绍如何在libxml2中添加由字符串构建的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解析字符串,然后将新节点的子节点添加到父节点。重要的是添加新节点而不是新节点的子节点以避免<a><a/>在最终的XML中。

libxml2有一个创建文档片段的函数。这在某些语言中公开为文档对象上的createDocumentFragment()方法。

最初应该是函数xmlNewDocFragment

相关内容

最新更新