我目前有一个我试图解析的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>]
所以它返回,但不是实际的可读数据。
答案 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标签不匹配