如何使用libxml2编写CDATA节点?

时间:2011-04-12 09:10:23

标签: libxml2 cdata

我正在使用libxml2来读/写xml文件。现在我正在尝试编写CDATA节点。

以下是我的尝试:

nodePtr = xmlNewChild( parentPtr, NULL, "foo", NULL );
xmlNodeSetContentLen( nodePtr, "<![CDATA[\nTesting 1 < 2\n]]>", len );

但是,这会产生以下编码文本:

<foo>&lt;![CDATA[
Testing 1 &lt; 2
]]&gt;</foo>

我想也许可能有一个特定于CDATA的libxml2 API。或者我可能需要调用别的东西告诉libxml2不要自动编码节点内容?

2 个答案:

答案 0 :(得分:4)

想出来。诀窍在于知道CDATA文本内容实际上是子节点而不是当前节点的一部分,并且要调用的关键API是xmlNewCDataBlock()。使用与上面相同的例子:

nodePtr = xmlNewChild( parentPtr, NULL, "foo", NULL );
cdataPtr = xmlNewCDataBlock( doc, "Testing 1 < 2", 13 );
xmlAddChild( nodePtr, cdataPtr );

这将产生以下xml:

<foo><![CDATA[Testing 1 < 2]]></foo>

答案 1 :(得分:0)

我不能说所有版本的libxml2,但根据libxml2-2.9.4,doc的返回节点的xmlNewChild部分来自其父节点。从xmlNewCDataBlock返回的子节点的父节点也是由doc参数设置的。所以以下是一个很好的做法:

const char str[] = "said the kitty";
xmlNodePtr node = xmlNewNode(NULL, BAD_CAST "meow");
xmlNodePtr cdata_node = xmlNewCDataBlock(node->doc, BAD_CAST str, strlen(str));
xmlAddChild(node, cdata_node);

生成的xml是

<meow><![CDATA[said the kitty]]></meow>

如果node属于xmlDoc

,则无关紧要