如何使用libxml2编写CDATA节点?
我正在使用 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 不要自动编码节点内容?
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
想通了。诀窍在于知道 CDATA 文本内容实际上是子节点而不是当前节点的一部分,并且要调用的关键 API 是 xmlNewCDataBlock()。使用与上面相同的示例:
这将生成以下 xml:
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:
This will produce the following xml:
我不能说对于 libxml2 的所有版本,但根据 libxml2-2.9.4,
xmlNewChild
返回节点的doc
部分来自其父级。另外,从xmlNewCDataBlock
返回的子节点的父节点由 doc 参数设置。因此,以下将是一个很好的做法:生成的 xml 是
并且
node
是否是xmlDoc
的一部分并不重要I cannot say for all versions of libxml2, but according to libxml2-2.9.4 the
doc
part of returning node ofxmlNewChild
comes from its parent. Also the parent of child node returned fromxmlNewCDataBlock
is set by doc parameter. So the following would be a good practice:The resulting xml is
And it would not matter if
node
is part of anxmlDoc
or not