如何使用libxml2编写CDATA节点?

发布于 2024-11-01 05:31:48 字数 432 浏览 3 评论 0原文

我正在使用 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 不要自动编码节点内容?

I'm using libxml2 to read/write xml files. Now I'm trying to write a CDATA node.

Here is what I tried:

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

However, this results in the following encoded text:

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

I'm thinking that perhaps there might be a CDATA-specific libxml2 API. Or maybe I have to call something else to tell libxml2 not to automatically encode the node content?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夜深人未静 2024-11-08 05:31:48

想通了。诀窍在于知道 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>

Figured it out. The trick is in knowing that CDATA text content is actually a child and not a part of the current node, and the critical API to call is xmlNewCDataBlock(). Using the same example as above:

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

This will produce the following xml:

<foo><![CDATA[Testing 1 < 2]]></foo>
你是我的挚爱i 2024-11-08 05:31:48

我不能说对于 libxml2 的所有版本,但根据 libxml2-2.9.4,xmlNewChild 返回节点的 doc 部分来自其父级。另外,从 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 的一部分并不重要

I cannot say for all versions of libxml2, but according to libxml2-2.9.4 the doc part of returning node of xmlNewChild comes from its parent. Also the parent of child node returned from xmlNewCDataBlock is set by doc parameter. So the following would be a good practice:

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);

The resulting xml is

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

And it would not matter if node is part of an xmlDoc or not

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文