当多个孩子共享一个名称

时间:2016-07-07 21:17:24

标签: python xml parsing

我目前有一个我试图解析的XML文件。这是我到目前为止的代码。

from xml.etree import ElementTree

with open('data.xml', 'rt') as f:
    tree = ElementTree.parse(f)

for node in tree.iter('Host'):
    hostname = node.find('Name').text
    ip = node.find('Networking/IP').text
    print hostname
    print ip

但是,我遇到了一个问题,因为所有这些设备都有3个IP地址,因此有多个XML" children"具有完全相同的名称。这是样本(实际主机名受阻)

<?xml version="1.0" encoding="UTF-8"?>
<APIResponse>
  <HostRecords>
    <Type>Dedicated</Type>
      <Host>
        <Name>dc-01-a.domain.com</Name>
        <Active>1</Active>
        <Networking>
          <Primary>Yes</Weight>
          <IP>10.0.8.72</IP>
        </Networking>
        <Networking>
          <Primary>No</Weight>
          <IP>10.12.12.1</IP>
        </Networking>
        <Networking>
          <Primary>Yes</Weight>
          <IP>fd30:0000:0000:0001:ff4e:003e:0009:000e</IP>
        </Networking>
      </Host>
    </Type>
  </HostRecords>
</APIResponse>

所以我的测试脚本会提取第一个IP,但是如何提取下两个IP呢?自从&#39; Networking / IP&#39;在3个点中是完全相同的,但它只会拉一个。另外,我如何制作它以便只抓取标记为主要的IP?

编辑:如果我尝试使用findall而不是找到我

  

AttributeError:&#39; list&#39;对象没有属性&#39; text&#39;

如果我删除了我得到的文字部分

[<Element 'RData' at 0x10ef67650>, <Element 'RData' at 0x10ef67750>, <Element 'RData' at 0x10ef67850>]

所以它返回,但不是实际的可读数据。

1 个答案:

答案 0 :(得分:1)

find方法可以接受一些有限的Xpath表达式,你可以用它来只提取标记为Primary的IP:

from xml.etree import ElementTree
tree = ElementTree.fromstring(sample)

for node in tree.iter('Host'):
    hostname = node.find('Name').text
    ips = node.findall("Networking[Primary='Yes']/IP")
    print hostname
    for ip in ips:
        print ip.text

有关允许使用哪些XPath表达式的更多信息,请参阅以下文档:https://docs.python.org/2/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element

问题中提供的示例XML在几个方面都是格式错误的(大概是在发布时被混淆了,或者给出的代码示例可能永远不会有效)。 Type标签关闭两次,主标签与关闭Weight标签不匹配