当多个子项共享一个名称时,使用Python解析XML
我目前正试图解析一个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
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(…)]