У меня есть xml со структурой, подобной этой:
<cat>
<foo>
<fooID>1</fooID>
<fooName>One</fooName>
<bar>
<barID>a</barID>
<barName>small_a</barName>
<barClass>
<baz>
<qux>
<corge>
<corgeName>...</corgeName>
<corgeType>
<corgeReport>
<corgeReportRes Reference="x" Channel="High">
<Pos>1</Pos>
</corgeReportRes>
</corgeReport>
</corgeType>
</corge>
</qux>
</baz>
</barClass>
</bar>
<bar>
<barID>b</barID>
<barName>small_b</barName>
<barClass>
<baz>
<qux>
<corge>
<corgeName>...</corgeName>
<corgeType>
<corgeReport>
<corgeReportRes Reference="y" Channel="High">
<Pos>1</Pos>
</corgeReportRes>
</corgeReport>
</corgeType>
</corge>
</qux>
</baz>
</barClass>
</bar>
</foo>
<foo>
<fooID>2</fooID>
<fooName>Two</fooName>
<bar>
<barID>c</barID>
<barName>small_c</barName>
<barClass>
<baz>
<qux>
<corge>
<corgeName>...</corgeName>
<corgeType>
<corgeReport>
<corgeReportRes Reference="z" Channel="High">
<Pos>1</Pos>
</corgeReportRes>
</corgeReport>
</corgeType>
</corge>
</qux>
</baz>
</barClass>
</bar>
</foo>
</cat>
И я хотел бы получить значения определенных c родительских / основных родительских / основных родительских тегов, которые имеют узел с атрибутом Channel="High"
. Я хотел бы получить только значение fooID, значение fooName, значение barID, значение barName.
У меня есть следующий код в Python 3:
import xml.etree.ElementTree as xmlET
root = xmlET.parse('file.xml').getroot()
test = root.findall(".//*[@Channel='High']")
Что на самом деле дает мне список элементов, которые совпадают, однако мне все еще нужна информация об определенных c родителях / бабушках / бабушках.
Как я могу это сделать?
fooID | fooName | barID | barName
- - - - - - - - - - - - - - - - -
1 | One | a | small_a <-- This is the information I'm interested
1 | One | b | small_b <-- Also this
2 | Two | c | small_c <-- And this
Изменить Узлы: fooID
и fooName
являются братьями и сестрами прародителя bar
, содержащего Channel="High"
. Это почти то же самое для barID
и barName
, они являются братьями и сестрами прародителя barClass
, содержащего Channel="High"
. Кроме того, я хочу получить значения 1
, One
, a
и small_a
, без фильтрации по ним, поскольку будет несколько блоков foo.