用libxml2缩进合并的XML文件

Indenting a merged xml file with libxml2

本文关键字:XML 文件 合并 libxml2 缩进      更新时间:2023-10-16

我正在尝试使用libxml2和c 合并两个XML文件。
这些XML文件具有相同的模式,但内容不同,我需要将一些元素合并到主XML文件中。这些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_merged"元素应具有相同的凹痕。

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

文档说:"请注意,format = 1仅在调用xmlIndentTreeOutput = 1xmlKeepBlanksDefault(0)时提供节点缩进。"

您的伪代码示例不包含其中任何一个,因此可能是问题。

还可以使用xmlstarlet formatxmllint --format之类的工具以后格式/重新指示XML文件。


更新:我做了更多的研究,Libxml2似乎不可能做的事情。引用常见问题:

libxml2不会发明文档内容中的空格 文档内容中的所有空格都是重要的。如果您建造 来自API的树并想要凹痕:

  1. 正确的方法也是自己生成这些。
  2. 危险的方法是要求libxml2将这些空白添加到您的 内容…

话虽如此,我确实通过使用xmlKeepBlanksDefault (0)来正确地获得了缩进的输出。但是我没有合并两个文档,我只是加载了一个文档并将一些节点插入其中。因此,如果它对您不起作用,则可能是因为您合并的节点包含白色空间。因此,您可以在插入之前尝试修剪。

当您不发布您要做什么的完整示例时,很难提供建议。