使用 python xml.etree 模块格式化插入的元素,以包含新行



我正在将单个元素插入到一个大的xml文件中。我希望插入的元素位于顶部(所以我需要使用root.insert方法,并且不能只附加到文件中)。我还希望元素的格式与文件的其余部分相匹配。

原始 XML 文件的格式为

<a>
    <b>
        <c/>
    </b>
    <d>
        <e/>
    </d>
    ....
</a>

然后,我运行以下代码:

import xml.etree.ElementTree as ET    
xmlfile = ET.parse('file.xml')
a = xmlfile.getroot()
f = ET.Element('f')
g = ET.SubElement(f,'g')
a.insert(1, f)
xmlfile.write('file.xml')

这将创建以下形式的输出:

<a>
    <b>
        <c/>
    </b>
    <f><g/></f><d>
        <e/>
    </d>
    ....
</a>

但我希望它的形式是:

<a>
    <b>
        <c/>
    </b>
    <f>
        <g/>
    </f>
    <d>
        <e/>
    </d>
    ....
</a>

使用Jonathan Eunice的解决方案来回答"如何让Python的ElementTree漂亮地打印到XML文件?我添加了以下代码来替换 xmlfile.write 命令:

from xml.dom import minidom
xmlstr = minidom.parseString(ET.tostring(a)).toprettyxml(indent="   ")
with open("New_Database.xml", "w") as f:
    f.write(xmlstr)

但是,整个文件的格式仍然不正确。它正确设置了新元素的格式,但原始元素现在已间隔开:

<b>

    <c/>

</b>

<f>
    <g/>
</f>
<c>

    <d/>

</c>
....
</a>

我认为这是因为 toprettyxml() 命令在""分隔符处添加了一个新行(因此在当前格式中添加了 2 个新行)。摆弄输入只会更改添加的元素或原始元素的格式是否不正确。在添加新元素之前,我需要一种方法来修改新元素或原始元素,以便它们的格式相同,然后我可以在打印前重新格式化整个批次吗?是否可以使用"xml.etree.ElementTree"添加格式?

提前谢谢。

可以使用 texttail 属性摆弄空格。也许这对你来说已经足够好了。请参阅下面的演示。

输入文档:

<a>
    <b>
        <c/>
    </b>
    <d>
        <e/>
    </d>
</a>

法典:

import xml.etree.ElementTree as ET    
xmlfile = ET.parse('file.xml')
a = xmlfile.getroot()
f = ET.Element('f')
g = ET.SubElement(f,'g')
f.tail = "n    "
f.text = "n        "
g.tail = "n    "
a.insert(1, f)
print ET.tostring(a)

输出:

<a>
    <b>
        <c />
    </b>
    <f>
        <g />
    </f>
    <d>
        <e />
    </d>
</a>

相关内容

最新更新