libxml2:xmlNewChild()中的特殊字符

libxml2:xmlNewChild()中的特殊字符,xml,special-characters,libxml2,Xml,Special Characters,Libxml2,这可能是一个非常愚蠢的问题,但如果有任何帮助,我将不胜感激。我正在使用libxml2从sql数据库中的数据构建一个XML文件。因此,我在sql表中的字段上循环并执行以下操作: xmlNewChild(node, NULL, (xmlChar*) template[i].c_str(), (xmlChar*) data[i].c_str()); 生成XML: <template>data</template> 但是,在XML中,它们总是呈现为和: <templat

这可能是一个非常愚蠢的问题,但如果有任何帮助,我将不胜感激。我正在使用libxml2从sql数据库中的数据构建一个XML文件。因此,我在sql表中的字段上循环并执行以下操作:

xmlNewChild(node, NULL, (xmlChar*) template[i].c_str(), (xmlChar*) data[i].c_str());
生成XML:

<template>data</template>
但是,在XML中,它们总是呈现为

<template>&lt;subnode&gt;text&lt;/subnode&gt;</template>
子节点文本/子节点
有没有办法保留角括号?我认为使用
xmlNewChild()
而不是
xmlNewTextChild()
可以保留字符,但显然不能。有没有一种方法可以将包含角括号的字符串放入
数据[i]
中,并在生成的XML中保留这些括号


(我意识到以这种方式隐藏额外的xml标记似乎是一种粗略的做法,但在我的例子中,这确实比计算出许多字段中的哪些字段需要子节点,然后以标准方式构建这些子节点要简单得多)。

不,你不能这样做。您需要首先解析子节点,然后将其添加到父节点。

否,libxml2将始终在内容中转义标记。在这方面我想了很多,也有很多不同的想法,但它们没有——它们只用于实体引用,比如
©。SetContent将把它作为一个“真实的”实体引用,但AddContent将把它转义为
&#169;

这似乎不起作用。我尝试过这样做:
xmlNode*childNode=xmlNewChild(node,NULL,(xmlChar*)模板[I].c_str(),NULL)xmlNodeSetContent(childNode,(xmlChar*)data[i].c_str())
,但结果仍然是
TEST
数据[i]所在的位置
。这与我刚才使用xmlNewChild()时的行为相同,据推测它也不会转义特殊字符。我以为我以前用过它,但我一定记错了。很抱歉,就像我担心的那样。不幸的是,我不能首先解析子节点,因为构建XML的代码不知道哪些节点需要子节点,哪些节点只包含文本。实际上,您希望将其解析为“元素内容”,可以是文本,也可以是子元素,类似于在JavaScript DOM中解析innerHTML。我不认为libxml2有一个方便的函数,但您可能可以使用xmlReader接口一起破解它。或者只是以不同的方式存储数据。:)
<template>&lt;subnode&gt;text&lt;/subnode&gt;</template>