如何使用python lxml加速使用xslt转换大型xml文件

时间:2014-03-11 08:20:00

标签: python xml xslt lxml

以下是我的源代码:

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中使用xslt转换xml文件?

2 个答案:

答案 0 :(得分:3)

如果您发现瓶颈是

newTree = transform(tree)

那么你的问题不是关于如何加速解析 XML。解析是事先完成的,文档在这里被读入内存(作为类似ElementTree的结构):

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

所以,也许你想问:

我可以加快大型输入文件的转换吗?

答案取决于代码中存在的操作类型。 lxml不是瑞士军刀(也不是任何其他软件,就此而言)。有些行动lxml实际上是无与伦比的,有些行动明显优于cElementTree类似的库。

例如,树遍历(将其视为更改上下文节点)被认为非常快,而与cET相比,生成新元素的成本很高。考虑解析,序列化和文档大小:

  

只要输入文件不比输出大得多,lxml就是明显的赢家。

这取自here,你会在那里找到关于这个主题的大量信息。

如果通过“转换”表示“应用XSLT样式表”,则上述考虑因素将没有多大用处。 lxml为此使用libxslt - 这本身就是一个库。


  

是否还有其他方法可以在python lxml中使用xsl解析xml文件?

还有其他图书馆,例如cElementTree。但是,我只使用它来处理XML输入 - 并且应用XSLT样式表可能很麻烦。

但在您得出结论之前,您应该确定样式表中存在的操作,比较输入和输出大小并研究lxml performanceperformance of your stylesheet

您应该知道1 GB的XML文件非常大,我不希望它能在任何地方顺利解析或转换。

答案 1 :(得分: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