读取XML同名子元素python

2024-07-05 14:18:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我对XML解析和python也是新手,我需要找到树的子元素并打印它们。你知道吗

我有一个这样的XML文件。这是我的档案- https://gofile.io/?c=OXcdue

  • 分配 --排队 ---队列的子元素 ---队列(子元素) ----此队列的子元素 ----排队 ----排队

我的要求是读取所有具有子队列及其子队列的队列。你知道吗


Tags: 文件httpsio元素队列档案xml排队
2条回答

下面(不使用外部库)

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>

您可以使用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文件的各个部分并递归查找所有子元素的详细信息,请参阅文档here。。本文档适用于标准xml库,但由于lxml构建在xml之上,因此lxml库也支持此文档。你知道吗

相关问题 更多 >