【问题标题】:xml indent and newline for new child新孩子的 xml 缩进和换行
【发布时间】:2015-05-28 08:14:28
【问题描述】:

我有一个如下所示的 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 默认不支持空格。但是,有没有办法达到我想要的结果?对于新添加的孩子,我需要将这些选项卡放在前面,最后换行。

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

【问题讨论】:

    标签: c xml libxml2


    【解决方案1】:

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

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

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

    您需要编辑children 中的最后一个文本节点(紧跟在foo2 之后的那个),给它一个额外的缩进,然后附加你的新节点,然后将一个新的文本节点附加到缩进&lt;/children&gt;。或者,您可以在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 是一个相关的答案。

    【讨论】:

    • 我意识到在解析文件之前需要设置xmlKeepBlanksDefault(0);。它确实为我们自动缩进,这对我的目的来说已经足够了。但绝对文本方法值得一试。谢谢。
    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 2014-12-26
      • 2014-10-16
      • 2013-12-12
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      相关资源
      最近更新 更多