【问题标题】:Is there an elegant way to count tag elements in a xml file using lxml in python?有没有一种优雅的方法可以在 python 中使用 lxml 来计算 xml 文件中的标签元素?
【发布时间】:2023-03-31 15:36:01
【问题描述】:

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

给定一个 xml(见下文)文件,你如何计算 xml 标签,例如 count of author-tags 在下面的示例中,最优雅的方式 ? 我们假设每个作者只出现一次。

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

这个xml文件很琐碎,但有可能,作者并不总是一个接一个地列出来,他们之间可能还有其他标签。

【问题讨论】:

    标签: python xml tags count lxml


    【解决方案1】:

    使用模块 re 处理 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
    

    【讨论】:

      【解决方案2】:

      如果要统计所有作者标签:

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

      【讨论】:

        【解决方案3】:

        使用XPathcount

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-07-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-24
          • 2014-11-18
          • 2022-12-24
          相关资源
          最近更新 更多