Чтение XML подэлемента Python с тем же именем - PullRequest
0 голосов
/ 10 октября 2019

Я новичок в разборе XML и Python. Мне нужно добраться до подэлементов дерева и распечатать их все.

У меня есть файл XML, который выглядит следующим образом. Вот мой файл - https://gofile.io/?c=OXcdue

  • выделения - очередь --- подэлементы очереди --- очередь (подэлемент) ---- подэлемент этой очереди ---- очередь ----queue

Мое требование - прочитать все очереди, в которых есть вложенные очереди и их вложенные очереди.

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Вы можете использовать библиотеку lxml для анализа любого содержимого XML. Эта библиотека лучше, чем стандартная библиотека xml, поскольку она позволяет вам при необходимости получить пространство имен документа xml (в вашем случае не требуется).

from lxml import etree
tree = etree.parse(path_to_xml_file)
root = tree.getroot()

for children in root.getchildren():
    print (children.tag)

    for child in children:
        print(child.tag, child.text)

См. Документацию здесь для получения дополнительной информации о том, как получить доступ к различным частям вашего XML-файла и как рекурсивно найти все подэлементы. Эта документация для стандартной библиотеки xmlно также поддерживается в библиотеке lxml, поскольку lxml построен поверх xml.

0 голосов
/ 10 октября 2019

Ниже (без использования внешней библиотеки)

import pprint
import xml.etree.ElementTree as ET

xml = '''<allocations>
    <queue name="bdpaas_express_q1">
      <minResources>12000 mb,2 vcores,1 disks</minResources>
      <maxResources>18000 mb,3 vcores,2 disks</maxResources>
      <aclSubmitApps> xyz</aclSubmitApps>
      <aclAdministerApps> xyz</aclAdministerApps>
      <label>allnodes</label>
    </queue>
    <queue name="dl_priority_q1">
      <minResources>8496000 mb,1416 vcores,108 disks</minResources>
      <maxResources>12768000 mb,2128 vcores,162 disks</maxResources>
      <aclSubmitApps> dla_grp</aclSubmitApps>
      <aclAdministerApps> dla_grp</aclAdministerApps>>
      <label>fastnodes</label>
    </queue>
    <queue name="pireporting_q1">
      <minResources>6960000 mb,1160 vcores,87 disks</minResources>
      <maxResources>10440000 mb,1740 vcores,130 disks</maxResources>
      <queue name="atscale_rtam_mr_sq1">
        <minResources>6000000 mb,1000 vcores,75 disks</minResources>
        <maxResources>9000000 mb,1500 vcores,112 disks</maxResources>
        <aclSubmitApps> atscalep</aclSubmitApps>
        <aclAdministerApps> atscalep</aclAdministerApps>
        <label>allnodes</label>
      </queue>
      <queue name="atscale_spark_sq1">
        <minResources>960000 mb,160 vcores,12 disks</minResources>
        <maxResources>1440000 mb,240 vcores,18 disks</maxResources>
        <aclSubmitApps> atscalep</aclSubmitApps>
        <aclAdministerApps> atscalep</aclAdministerApps>
        <label>allnodes</label>
      </queue>
    </queue>
  <queuePlacementPolicy>
    <rule create="false" name="specified" />
    <rule name="reject" />
  </queuePlacementPolicy>
</allocations>
'''


root = ET.fromstring(xml)
queues = root.findall('.//queue')
for queue in queues:
  if queue.find('./queue'):
    print(ET.tostring(queue, encoding='utf8', method='xml'))

вывод

<?xml version="1.0" encoding="UTF-8"?>
<queue name="pireporting_q1">
   <minResources>6960000 mb,1160 vcores,87 disks</minResources>
   <maxResources>10440000 mb,1740 vcores,130 disks</maxResources>
   <queue name="atscale_rtam_mr_sq1" />
   <queue name="atscale_spark_sq1" />
</queue>
...