xml 新的缩进和换行 child

xml indent and newline for new child

我有一个 xml 文件,如下所示。

<root>
    <children>
        <foo1 val="23"/>
        <foo2 val="14"/>
    </children>
</root>

我希望使用函数 xmlNewChild()[= 添加一个名为 foo 的新 child 到节点28=] 后跟 xmlNewProp()。我想生成如下内容。

<root>
    <children>
        <foo1 val="23"/>
        <foo2 val="14"/>
        <foo3 val="5"/>
    </children>
</root>

然而,我总是得到以下结果。

<root>
    <children>
        <foo1 val="23"/>
        <foo2 val="14"/>
    <foo3 val="5"/></children>
</root>

我知道 libxml2 默认不支持空格。但是,有没有办法达到我想要的结果?对于新添加的 child.

,我需要在前面获取这些选项卡,在最后获取换行符

如有任何帮助,我们将不胜感激。谢谢!

问题是 XML 结构实际上是这样的:

<root>
    [TEXT:"\n    "]
    <children>
        [TEXT:"\n        "]
        <foo1 val="23"/>
        [TEXT:"\n        "]
        <foo2 val="14"/>
        [TEXT:"\n    "]
    </children>
    [TEXT:"\n"]
</root>

如果你只是在children的末尾添加一个额外的元素节点,你会看到你得到的是不可避免的(因为没有文本节点来携带换行符和[=之间所需的缩进) 13=] 和 children).

您需要编辑 children 中的最后一个文本节点(紧接在 foo2 之后的文本节点)以给它一个额外的缩进,然后追加您的新节点,然后追加一个新的文本节点到缩进 </children>。或者,您可以在 children 中插入与先前文本节点相同的文本节点,然后在 children 中的最终文本节点之前插入新元素节点。两者都应该给你相同的结果,你需要的那个:

<root>
    [TEXT:"\n    "]
    <children>
        [TEXT:"\n        "]
        <foo1 val="23"/>
        [TEXT:"\n        "]
        <foo2 val="14"/>
        [TEXT:"\n        "]
        <foo3 val="5"/>
        [TEXT:"\n    "]
    </children>
    [TEXT:"\n"]
</root>

另一种方法是让 libxml2 为您自动缩进输出。这将破坏现有的缩进并从头开始重做。 Here 是一个相关的答案。

使用xmlTextWriterSetIndent

参考:http://xmlsoft.org/html/libxml-xmlwriter.html#xmlTextWriterSetIndent