sissaschool/elementpath

select() always calls root ElementTree instead of child one

kkuriata opened this issue · 2 comments

I use elementpath with defusedxml.ElementTree and it basically works fine until I want queries to be relative.

For example:

<elements>
  <element id="1">
    <list>
      <item>
        <p name="someParam1">1</p>
        <p name="someParam2">2</p>
      </item>
    </list>
  </element>
  <element id="2">
    <list>
      <item>
        <p name="someParam1">3</p>
        <p name="someParam2">4</p>
      </item>
      <item>
        <p name="someParam1">5</p>
        <p name="someParam2">6</p>
      </item>
    </list>
  </element>
</elements>
from elementpath import select

root = defusedxml.ElementTree.parse("./my_file.xml")
chosen_elements = select(root, "//elements/element[number(@id) < 3]")  # getting a list of ElementTree instances

for el in chosen_elements:
  # I want it to search inside el (not inside root)
  params = select(el, "//list/item/p[@name = 'someParam1']/text()")

I expect this code to return ["1"] for element@id = 1 and ["3", "5"] for element@id = 2. Unfortunately, it returns ["1", "3", "5"] for each element. It looks like select(el, ...) behaves the same as select(root, ...). Of course we can change our query to precise which element we want, but the problem is when we have e.g. 50k of elements, then this query takes forever to finish. That's why I wanted to search through each element separately.

Ok, I have just found out that it doesn't work only with version 0.7.0 - on 0.7.1 everything is fine.

Ok, I have just found out that it doesn't work only with version 0.7.0 - on 0.7.1 everything is fine.

Hi, to which package versions 0.7.0 - 0.7.1 refer?