2016-12-14 56 views
1

我想使用libxml2和C++合并两个xml文件。
这些XML文件具有相同的架构,但具有不同的内容,我需要将一些元素合并到主XML文件中。 而这些XML文件有不同的缩进。 (一个人的空间,但另一个有标签)使用libxml2缩进合并的xml文件

这里是我的伪代码:

xmlDocPtr doc1 = xmlParseFile(...); 
xmlDocPtr doc2 = xmlParseFile(...); 

xmlNodePtr node_from_doc1; 
for (node; ...) { 
    ... 
    xmlAddNextSibling(node_from_doc1, node); 
    ... 
} 

xmlSaveFormatFile("merged.xml", doc1, 1); 

而且合并后的xml文件没有缩进很好。

<root_elem attr1="attr"> 
    ... 
    <child>child_text</child> 
    <child_merged>child_merged</child_merged> 
</root_elem> 

'child'元素和'child_merged'元素应该有相同的缩进。

如何缩进合并文件? 在此先感谢。

回答

1

该文档说:“请注意,format = 1只有在调用xmlIndentTreeOutput = 1xmlKeepBlanksDefault(0)时才提供节点缩进。”

您的伪代码示例不包含任何这些,所以这可能是问题。

此外,您可以使用像xmlstarlet formatxmllint --format这样的工具来格式化/重新缩进xml文件。


UPDATE: 我做了一些更多的研究和它看起来像你正在尝试做的是不可能的libxml2。再举FAQ

的libxml2不会发明在文档的内容空间,因为 在文档的内容的所有空间是显著。如果您从API构建一棵树并且想要缩进:

  1. 正确的方法是自己生成这些树。
  2. 危险的方法就是让libxml2的那些空白添加到您的 内容...

话虽这么说,我还是设法通过xmlKeepBlanksDefault (0)得到正确缩进输出。但是我没有合并两个文档,我只是加载了一个文件,并在其中插入了一些节点。因此,如果它不适合你,可能是因为你正在合并的节点包含空白。所以你可以在插入之前尝试修剪。

当你没有发布你想要做的完整例子时,很难给出建议。

+0

我叫'xmlKeepBlanksDefault(0)',但它不起作用... – Jeremy

+1

@Jeremy我明白了。你在进行解析之前称之为*,对吗?在我上面更新的答案。 –

+0

Ooops,解析后我调用'xmlKeepBlacnksDefault(0)'。现在我可以在解析之前获取缩进xml调用此api! – Jeremy