Find element by text with XPath in ElementTree

后端 未结 3 1839
被撕碎了的回忆
被撕碎了的回忆 2020-12-03 21:31

Given an XML like the following:


    A
    B

How c

相关标签:
3条回答
  • 2020-12-03 21:46

    You can use XPath in ElementTree. It isn't necessary to install any lib.

    config.findall('.//*[element="A"]/element')
    

    As the comment bellow from @Bionicegenius explains, the expression above just works if your element has no sibilings, but you get the idea.

    It is possible to use XPath in ElementTree, and it is the simplest solution.

    0 讨论(0)
  • 2020-12-03 21:54

    AFAIK ElementTree does not support XPath. Has it changed?

    Anyway, you can use lxml and the following XPath expression:

    import lxml.etree
    doc = lxml.etree.parse('t.xml')
    print doc.xpath('//element[text()="A"]')[0].text
    print doc.xpath('//element[text()="A"]')[0].tag
    

    The result will be:

    A
    element
    
    0 讨论(0)
  • 2020-12-03 22:03

    If you want to use the standard library ElementTree, rather than lxml, you can use iteration to find all sub elements with a particular text value. For example:

    import sys
    import xml.etree.ElementTree as etree
    
    s = """<root>
        <element>A</element>
        <element>B</element>
    </root>"""
    
    e = etree.fromstring(s)
    
    if sys.version_info < (2, 7):
        found = [element for element in e.getiterator() if element.text == 'A']
    else:
        found = [element for element in e.iter() if element.text == 'A']
    
    print found[0].text # This prints 'A', honestly!
    

    Note: you may want to perform some stripping of the text value of your elements in the list comprehension.

    Edit This will work to any depth in your XML tree. For example,

    s = """<root>
        <element>A</element>
        <element><sub>A</sub></element>
    </root>"""
    
    found = [element for element in e.getiterator() if element.text == 'A']
    
    for f in found:
        print f
    

    will print

    <Element element at 7f20a882e3f8>
    <Element sub at 7f20a882e4d0>
    
    0 讨论(0)
提交回复
热议问题