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

标签 python xml elementtree pretty-print 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() 命令在 '\n' 分隔符处添加了一个新行(因此向当前格式添加了 2 个新行)。摆弄输入只会改变添加的元素或原始元素的格式是否不正确。我需要一种方法在添加新元素之前修改新元素或原始元素,以便它们的格式相同,然后我可以在打印前重新格式化所有元素吗?是否可以使用“xml.etree.ElementTree”添加格式?

提前致谢。

最佳答案

可以使用 text and tail 来修改空格特性。也许这对你来说已经足够了。请参阅下面的演示。

输入文档:

<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>

关于python - 使用 python xml.etree 模块格式化插入的元素,以包含新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35012339/

相关文章:

python - 在 numpy 数组中对 1 的 block 进行排名的快速、python 风格的方法?

c# - 在 python 中写入结构化数据并在 C# 中读取的最轻松的方法

java - Android:我如何从数据库设置 <item></item> 的值?

python - 使用 lxml/ElementTree 获取非连续文本

python - 如何将图像添加到 Pythonista 的 ui 设计器

python - 被tornado.concurrent.Future异常困惑

xml - 或者在 XPath 表达式中从多个节点名称中进行选择

python - etree xml解析和删除

Python读取带有相关子元素的xml

python:在没有正则表达式的情况下计算和替换字符串中的模式