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