如何使用Python lxml加速大XML文件的XSLT转换
以下是我的源代码:
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文件是非常大的,我不指望它能在任何地方顺利解析或转换。