我正在使用libxml2来读/写xml文件。现在我正在尝试编写CDATA节点。
以下是我的尝试:
nodePtr = xmlNewChild( parentPtr, NULL, "foo", NULL );
xmlNodeSetContentLen( nodePtr, "<![CDATA[\nTesting 1 < 2\n]]>", len );
但是,这会产生以下编码文本:
<foo><![CDATA[
Testing 1 < 2
]]></foo>
我想也许可能有一个特定于CDATA的libxml2 API。或者我可能需要调用别的东西告诉libxml2不要自动编码节点内容?
答案 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
或