Как получить теги родителей и дедушек с заданным атрибутом c в XML в python? - PullRequest
0 голосов
/ 18 июня 2020

У меня есть 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.

1 Ответ

1 голос
/ 19 июня 2020

Если я вас правильно понял, вы, вероятно, ищете что-то вроде этого (используя ):

from lxml import etree
foos = """[your xml above]"""
items = []
for entry in doc.xpath('//foo[.//corgeReportRes[@Channel="High"]]'):
    items.append(entry.xpath('./fooID/text()')[0])
    items.append(entry.xpath('./fooName/text()')[0])
    items.append(entry.xpath('./bar/barID/text()')[0])
    items.append(entry.xpath('./bar/barName/text()')[0])
print('fooID | fooName | barID | barName')
print('  |  '.join(items))

Вывод:

fooID | fooName | barID | barName
1  |  One  |  a  |  small_a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...