Python - ElementTree- cannot use absolute path on element

28,958

Turns out I needed to say target.findall(".//StepText"). I guess anything without the '.' is considered an absolute path?

Updated working code:

def search():
    root = ET.parse(INPUT_FILE_PATH)
    for target in root.findall("//Script"):
        stepTexts = target.findall(".//StepText")
        for stepText in stepTexts:
            if FIND.lower() in stepText.text.lower():
                print target.attrib['name'],' -- ',stepText.text
Share:
28,958
Greg
Author by

Greg

I'm an avid programmer, web developer and electronics enthusiast. Here's my gift to Python hackers. And you can see everything I'm up to here.

Updated on December 20, 2020

Comments

  • Greg
    Greg over 3 years

    I'm getting this error in ElementTree when I try to run the code below:

    SyntaxError: cannot use absolute path on element
    

    My XML document looks like this:

    <Scripts>
      <Script>
        <StepList>
          <Step>
            <StepText>
            </StepText>
            <StepText>
            </StepText>
          </Step>
        </StepList>
      </Script>
    </Scripts>
    

    Code:

    import xml.etree.ElementTree as ET
    
    def search():
        root = ET.parse(INPUT_FILE_PATH)
        for target in root.findall("//Script"):
            print target.attrib['name']
            print target.findall("//StepText")
    

    I'm on Python 2.6 on Mac. Am I using Xpath syntax wrong?

    Basically I want to show every Script elements name attribute if it contains a StepText element with certain text.

  • Admin
    Admin about 13 years
    Any XPath expression starting with / or // operator is an absolute expression. Besides this, that restriction (absolute expressions not allowed with other context node than root) is specific to your XPath engine implementation.
  • jxramos
    jxramos over 7 years
    @user357812 is there a way to query which engine a particular XPath implementation is using?