如何在迭代编写时强制缩进 python LXML xml 元素嵌套?

问题描述 投票:0回答:0

我正在使用 LXML 编写一个 xml 文件,该文件是数据库的转储。 鉴于数据的大小,我必须反复编写 xml 文件。将 etree 转储到文件时,我在具有 32GB ram 的服务器上内存不足。

我已经编写了通过此页面上的方法迭代写入 xml 的代码https://lxml.de/api.html#incremental-xml-generation 参考此处在 python 中迭代写入 XML 节点。代码运行良好,我的服务器在前 5gb 内存内轻松生成 xml。

唯一的障碍是迭代写入不会保留我在转储 etree 时的缩进。我想要如下图所示的缩进。

我试过 etree.indent() 方法,但它只在客户端嵌套内缩进 4 个空格。我还在一些地方尝试了硬编码空间(比如 xml_file.write(" ")),但随后各个标签放错了位置。

如何强制“客户端”嵌套比现在缩进 4 个空格?

非常感谢您的帮助。

生成迭代 xml 的代码写入和不正确的缩进:

from lxml import etree

client = etree.Element("Client")

client.append(etree.Element("ClientID"))
client[0].text = "12345"

client.append(etree.Element("ClientProfile"))
client[1].append(etree.Element("User"))

client[1][0].append(etree.Element("FirstName"))
client[1][0][0].text = "John"

client[1][0].append(etree.Element("LastName"))
client[1][0][1].text = "Doe"

client[1][0].append(etree.Element("AccountName"))
client[1][0][2].text = "Acme Inc"

client[1][0].append(etree.Element("EmailAddress"))
client[1][0][3].text = "[email protected]"

client.append(etree.Element("SalesMetric"))
client[2].text = "12345"

filename = "test.xml"
with etree.xmlfile(filename, encoding="utf-8") as xml_file:
    with xml_file.element("DbDump"):
        xml_file.write("\n    ")

        version = etree.Element("ModelVersion")
        version.text = "1.2.1"
        xml_file.write(version, pretty_print=True)

        etree.indent(client, space="    ")

        for value in "12":
            xml_file.write(client, pretty_print=True)
python xml iteration lxml
© www.soinside.com 2019 - 2024. All rights reserved.