当多个子项共享一个名称时,使用Python解析XML

当多个子项共享一个名称时,使用Python解析XML,python,xml,parsing,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

我目前正试图解析一个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“子项”。这是示例(实际主机名被阻塞)


献身的
dc-01-a.domain.com
1.
对
10.0.8.72
不
10.12.12.1
对
fd30:0000:0000:0001:ff4e:003e:0009:000e
所以我的测试脚本拉第一个IP,但是我如何拉接下来的两个IP呢?因为“网络/IP”在三个点上是完全相同的,但它只会拉一个点。另外,我如何使它只捕获标记为主IP的IP

编辑:如果我尝试使用findall而不是find,我会得到

AttributeError:“列表”对象没有属性“文本”

如果我删除文本部分,我会得到

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

因此它返回,但不是作为实际可读数据返回。

find方法可以接受一些有限的Xpath表达式,您可以使用它仅提取标记为主的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表达式的更多信息,请参阅以下位置的文档:



问题中提供的示例XML在几个方面的格式不正确(可能是在发布时对其进行了模糊处理,或者给出的代码示例根本无法工作时)。类型标记关闭了两次,并且主标记与关闭权重标记不匹配

find方法可以接受一些有限的Xpath表达式,您可以使用它仅提取标记为主的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表达式的更多信息,请参阅以下位置的文档:



问题中提供的示例XML在几个方面的格式不正确(可能是在发布时对其进行了模糊处理,或者给出的代码示例根本无法工作时)。类型标记关闭两次,并且主标记与关闭权重标记不匹配

检查XML结构。看起来您的第三个网络标记是错误的。可能使用
node.findall()
而不是
node.find()
?啊,收到了,谢谢。为了公司隐私,我试图阻止大量额外的数据,同时将所需的相关数据保留在那里。John Gordon在我尝试时遇到AttributeError:“list”对象没有属性“text”@Mallachar
[x.text for x in node.findall(…)]
检查XML结构。看起来您的第三个网络标记是错误的。可能使用
node.findall()
而不是
node.find()
?啊,收到了,谢谢。为了公司隐私,我试图阻止大量额外的数据,同时将所需的相关数据留在那里。当我试图阻止时,我遇到了AttributeError:“list”对象没有属性“text”@Mallachar
[x.text for x in node.findall(…)]