以下是我的源代码:
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文件?
答案 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 performance或performance 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