使用libxml2缩进合并的xml文件 我试图用LIbxML2和C++来合并两个XML文件。 这些xml文件具有相同的模式,但内容不同,我需要将一些元素合并到主xml文件中。 这些xml文件有不同的缩进。(一个有空格,另一个有制表符)

使用libxml2缩进合并的xml文件 我试图用LIbxML2和C++来合并两个XML文件。 这些xml文件具有相同的模式,但内容不同,我需要将一些元素合并到主xml文件中。 这些xml文件有不同的缩进。(一个有空格,另一个有制表符),c++,xml,merge,libxml2,C++,Xml,Merge,Libxml2,这是我的伪代码: xmlDocPtr doc1 = xmlParseFile(...); xmlDocPtr doc2 = xmlParseFile(...); xmlNodePtr node_from_doc1; for (node; ...) { ... xmlAddNextSibling(node_from_doc1, node); ... } xmlSaveFormatFile("merged.xml", doc1, 1); 合并后的xml文件没有很好地缩进 <r

这是我的伪代码:

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”元素应该具有相同的缩进

如何才能很好地缩进合并的文件? 提前感谢。

文档中说:“请注意,
format=1
仅当调用了
xmldindenttreeoutput=1
xmlKeepBlanksDefault(0)
时才提供节点缩进。”

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

您还可以使用
xmlstarlet format
xmllint--format
等工具对xml文件进行格式化/重新缩进


更新: 我做了一些进一步的研究,似乎您试图做的事情在libxml2中是不可能的。引用:

Libxml2不会在文档内容中发明空格,因为 文档内容中的所有空格都是重要的。如果你建立 API中的树,需要缩进:

  • 正确的方法是自己生成这些
  • 危险的方法是要求libxml2将这些空格添加到 内容
  • 也就是说,我确实通过使用
    xmlkepblanksdefault(0)
    获得了正确的缩进输出。但我并没有合并两个文档,我只是加载了一个,并在其中插入了一些节点。因此,如果它不适用于您,可能是因为您正在合并的节点包含空格。因此,您可以在插入之前尝试修剪


    如果你不发布一个完整的例子来说明你想做什么,你就很难给出建议。

    @Jeremy我明白了。你在做分析之前打过电话,对吗?根据上面更新的答案。oops,我在解析后调用了
    xmlKeepBlacnksDefault(0)
    。现在我可以在解析之前调用这个api得到缩进的xml了!正如你所说,我发现有“text”元素包含空格。谢谢你的建议。