xml缩进和新子项的换行符

时间:2015-05-28 08:14:28

标签: c xml libxml2

我有一个看起来像跟随的xml文件。

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

我希望使用函数 xmlNewChild(),然后是 xmlNewProp(),将一个名为 foo 的新子节点添加到节点。我希望生成如下内容。

<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默认不支持空格。但是,有没有办法实现我想要的结果?我需要在新添加的孩子的前面和新行中添加这些标签。

任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:4)

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

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

如果你只是在children的末尾添加一个额外的元素节点,你可以看到你获得的是不可避免的(因为没有文本节点来携带换行符和{{1}之间所需的缩进}和foo3)。

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

children

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

答案 1 :(得分:0)