非根元素中的 libxml2 输出命名空间声明

libxml2 output namespace declarations in non-root elements

我有这样的文档

<a:root xmlns:a="http://example.com/roots" xmlns:b="http://example.com/subs" xmlns:c="http://example.com/subsubs">
    <b:sub>
        <c:subsub>Hello World</c:subsub>
    </b:sub>
</a:root>

使用 xmlNodeDump 我想为 sub 输出 XML 和更深的输出,即我想以

结束
<b:sub xmlns:b="http://example.com/subs" xmlns:c="http://example.com/subsubs">
    <c:subsub>Hellow World<c:subsub>
</b:sub>

然而,因为命名空间声明在 root 标记中,当我转储 XML 时,命名空间声明丢失,我最终得到

<b:sub>
    <c:subsub>Hellow World<c:subsub>
</b:sub>

这不再有效。问题是:如何确保正在输出的 XML 将相关的命名空间声明添加到新的顶级元素,即 sub ?

诀窍是在转储之前复制节点:

xmlNodePtr copy = xmlCopyNode(node, 1);
xmlNodeDump(..., copy, ...);
xmlFreeNode(copy);

xmlCopyNode 将必要的命名空间声明添加到复制的节点。