在Python中迭代写入XML节点

3 投票
4 回答
1964 浏览
提问于 2025-04-16 14:07

读取XML文件有很多方法,可以一次性读取全部内容(叫做DOM),也可以逐步读取(叫做SAX)。我用过SAX或者lxml来逐步读取大型XML文件,比如维基百科的备份文件,压缩后有6.5GB。

不过在用Python的ElementTree对这个XML文件进行了一些逐步处理后,我想把(新的)XML数据写到另一个文件里。

有没有什么库可以逐步写出XML数据?我可以创建一个XML树然后写出来,但那需要大量的内存。有没有办法可以逐步把XML树写到文件里?也就是一小部分一小部分地写?

我知道我可以自己生成XML,比如用print "<%s>" % tag_name这样的方式,但这看起来有点... 不太正规

4 个回答

1

如果你正在读取一种叫做XML的格式1,然后需要写成另一种叫做XML的格式2,使用xslt来记录这个转换过程是不是个好主意呢?这样你可能甚至不需要任何源代码。

1

使用lxml库,你可以通过etree.Element来创建新的节点,然后用etree.tostring把这些节点转换成XML格式的字符串。比如,你可以参考这个链接中的示例6,它展示了如何把一个元素的子节点序列化,来自Liza Daly的文章《使用lxml在Python中进行高性能XML解析》。

4

Fredrik Lundh的elementtree.SimpleXMLWriter可以让你逐步写出XML文件。下面是这个模块中嵌入的示例代码:

from elementtree.SimpleXMLWriter import XMLWriter
import sys

w = XMLWriter(sys.stdout)

html = w.start("html")

w.start("head")
w.element("title", "my document")
w.element("meta", name="generator", value="my application 1.0")
w.end()

w.start("body")
w.element("h1", "this is a heading")
w.element("p", "this is a paragraph")

w.start("p")
w.data("this is ")
w.element("b", "bold")
w.data(" and ")
w.element("i", "italic")
w.data(".")
w.end("p")

w.close(html)

撰写回答