有没有一种优雅的方法来使用python中的lxml来计算xml文件中的标记元素?

时间:2011-06-26 12:19:05

标签: python xml tags count lxml

我可以将xml文件的内容读取为字符串并使用字符串操作来实现这一点,但我想有更优雅的方法来实现这一点。由于我没有在docus中找到线索,我在这里寻找:

给定一个xml(见下文)文件,你如何计算xml标签,比如示例中的作者标签数,以最优雅的方式我们假设每个作者只出现一次。

<root>
    <author>Tim</author>
    <author>Eva</author>
    <author>Martin</author>
    etc.
</root>

这个xml文件很简单,但是作者并不总是一个接一个地列出,它们之间可能还有其他标记。

3 个答案:

答案 0 :(得分:24)

如果您想计算所有作者标签:

import lxml.etree
doc = lxml.etree.parse(xml)
count = doc.xpath('count(//author)')

答案 1 :(得分:8)

XPath使用count

答案 2 :(得分:2)

必须小心使用模块重新来处理SGML / XML / HTML文本,因为并非所有这些文件的处理都无法使用正则表达式执行(正则表达式无法解析 SGML / HTML / XML文本)

但是在这里,在这个特殊的问题中,在我看来它是可能的(re.DOTALL是强制性的,因为一个元素可以扩展到多行;除此之外,我无法想象任何其他可能的陷阱)

from time import clock
n= 10000
print 'n ==',n,'\n'



import lxml.etree
doc = lxml.etree.parse('xml.txt')

te = clock()
for i in xrange(n):
    countlxml = doc.xpath('count(//author)')
tf = clock()
print 'lxml\ncount:',countlxml,'\n',tf-te,'seconds'



import re
with open('xml.txt') as f:
    ch = f.read()

regx = re.compile('<author>.*?</author>',re.DOTALL)
te = clock()
for i in xrange(n):
    countre = sum(1 for mat in regx.finditer(ch))
tf = clock()
print '\nre\ncount:',countre,'\n',tf-te,'seconds'

结果

n == 10000 

lxml
count: 3.0 
2.84083032899 seconds

re
count: 3 
0.141663256084 seconds