如何使用Python lxml加速大XML文件的XSLT转换

1 投票
2 回答
1838 浏览
提问于 2025-04-17 21:45

以下是我的源代码:

from lxml import etree as ET

tree = ET.parse("test.xml")
xslt = ET.parse("test.xsl")
transform = ET.XSLT(xslt)

print "before transform"
newTree = transform(tree)
print "after transform"
print str(newTree)

当test.xml文件很小的时候,这段代码运行得很好。
但是当test.xml文件很大(超过100MB或者GB)时,这段代码就会运行很久。

我发现瓶颈在于“newTree = transform(tree)”。

有没有其他方法可以用Python的lxml库来转换xml文件和xslt?

2 个回答

0

我找到了一种方法,可以提高用xslt转换XML文件的性能。

results = ""
tree = ET.iterparse(xml_file)
xslt = ET.parse(xsl_file)
transform = ET.XSLT(xslt)

for elem in tree:
    if (re.search("ContentItem", elem[1].tag)):
        newElem = transform(elem[1])
        #print str(newTree)
        results = results + str(newElem)

print results
3

如果你发现瓶颈在于

newTree = transform(tree)

那么你的问题就不是关于如何加快解析 XML的速度。解析是在之前完成的,文档已经被读取到内存中(像一个ElementTree的结构)在这里:

tree = ET.parse("test.xml")
xslt = ET.parse("test.xsl")

所以,也许你想问的是:

我能加快大文件的转换速度吗?

这个问题的答案取决于你代码中所做的操作。lxml并不是万用工具(其他软件也是如此)。有些操作在lxml中几乎无敌,而有些操作则被类似的库如cElementTree明显超越。

比如,树的遍历(可以理解为改变当前节点)被认为是非常快的,而生成新元素的成本相比cET就高得多。考虑到解析、序列化和文档的大小:

只要输入文档的大小没有比输出文档大很多,lxml就是明显的赢家。

这段话摘自这里,你可以在这里找到很多相关的信息。

如果你所说的“转换”是指“应用XSLT样式表”,那么上面的考虑就没什么用处了。lxml使用libxslt来处理这个问题——这本身就是一个独立的库。


有没有其他方法可以用xsl在python lxml中解析xml文件?

还有其他库,比如cElementTree。不过,我只用它来处理XML输入,可能用它来应用XSLT样式表会比较麻烦。

但在你下结论之前,应该先识别出样式表中包含的操作,比较输入和输出的大小,并研究lxml的性能样式表的性能

你要知道,1GB的XML文件是非常大的,我不指望它能在任何地方顺利解析或转换。

撰写回答