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

时间:2016-11-16 07:53:44

标签: xml libxml2

我有这样的文件

<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

1 个答案:

答案 0 :(得分:3)

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

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

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