【问题标题】:python xml - search for attribute with regular expressionspython xml - 使用正则表达式搜索属性
【发布时间】:2016-08-07 03:51:55
【问题描述】:

在我的 xml 文件中,我有这样的节点:

<waitingJobs idList="J03ac2db8 J03ac2fb0"/>

我知道如何使用.findall 来搜索属性,但现在看来我需要使用正则表达式,因为I can't just use

root.findall('./[@attrib='value']')

我必须使用

root.findall('./[@attrib='*value*']')

问题

  1. xml.etree 可以做到这一点吗?
  2. lxml 如何做到这一点?

【问题讨论】:

    标签: python xml xpath


    【解决方案1】:

    不幸的是,xml.etree.ElementTree 内置库不支持 contains()starts-with() 之类的内容。您可以手动检查属性,找到所有waitingJobs 并使用.attrib 获取idList 值:

    import xml.etree.ElementTree as ET
    
    data = """<jobs>
        <waitingJobs idList="J03ac2db8 J03ac2fb0"/>
    </jobs>
    """
    
    root = ET.fromstring(data)
    value = 'J03ac2db8'
    print([elm for elm in root.findall(".//waitingJobs[@idList]") 
           if value in elm.attrib["idList"]])
    

    有了lxml.etree,你可以使用xpath()方法和contains()函数:

    import lxml.etree as ET
    
    data = """<jobs>
        <waitingJobs idList="J03ac2db8 J03ac2fb0"/>
    </jobs>
    """
    
    root = ET.fromstring(data)
    
    value = 'J03ac2db8'
    print(root.xpath(".//waitingJobs[contains(@idList, '%s')]" % value))
    

    【讨论】:

    • 叹息。我想是时候转移到lxml了。 xml.etree 有多么糟糕,为什么它仍然包含在 Python 中?为什么lxml不是默认的???
    • @Adrian 好吧,这绝对是可悲的,但 Python 的美妙之处还在于 PyPI 上可用的第三方种类繁多。关于 xpath 支持受限的原因:stackoverflow.com/questions/10982557/…。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多