在没有内容转义的情况下将字符串注入XML节点

时间:2014-03-03 08:48:52

标签: xml libxml2

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

问题是 xmlNodeSetContent 函数或我正在使用的XML保存函数( xmlSaveFormatFileEnc )是否正在转义'<'和'>'字符为'& LT;”和'& GT;'

如何在此实例中关闭转义?或者,我可以格式化字符串以禁用转义吗?

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

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

2 个答案:

答案 0 :(得分:1)

我现在使用以下代码将XML文本(可能包含多个元素)注入现有节点(感谢Nazar和nwellnhof的一个答案并引用了我How to add a xml node constructed from string in libxml2):

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)添加一个周围的元素(&lt; a&gt; ...&lt; a /&gt;),使用xmlParseInNodeContext解析字符串,然后将新节点的子节点添加到父节点。重要的是添加新节点的子节点而不是新节点以避免具有&lt; a&gt; ...&lt; a /&gt;在最终的XML中。

答案 1 :(得分:0)

libxml2具有创建文档片段的功能。这在某些语言中作为文档对象上的createDocumentFragment()方法公开。

最初它应该是函数xmlNewDocFragment