使用Python从xml中的一个节点遍历到另一个节点

使用Python从xml中的一个节点遍历到另一个节点,python,xml,lxml,Python,Xml,Lxml,我对Python中的XML非常陌生,我从网络设备得到以下XML字符串作为响应: '<Response MajorVersion="1" MinorVersion="0"><Get><Configuration><OSPF MajorVersion="19" MinorVersion="2"><ProcessTable><Process><Naming><ProcessName>1</Proces

我对Python中的XML非常陌生,我从网络设备得到以下XML字符串作为响应:

'<Response MajorVersion="1" MinorVersion="0"><Get><Configuration><OSPF MajorVersion="19" MinorVersion="2"><ProcessTable><Process><Naming><ProcessName>1</ProcessName></Naming><DefaultVRF><AreaTable><Area><Naming><AreaID>0</AreaID></Naming><Running>true</Running><NameScopeTable><NameScope><Naming><InterfaceName>Loopback0</InterfaceName></Naming><Running>true</Running><Cost>1000</Cost></NameScope><NameScope><Naming><InterfaceName>Loopback1</InterfaceName></Naming><Running>true</Running><Cost>1</Cost></NameScope><NameScope><Naming><InterfaceName>GigabitEthernet0/0/0/0</InterfaceName></Naming><Running>true</Running><Cost>1</Cost></NameScope></NameScopeTable></Area></AreaTable></DefaultVRF><Start>true</Start></Process></ProcessTable></OSPF></Configuration></Get><ResultSummary ErrorCount="0" /></Response>'
打印“d”时,此代码提供以下输出:

{'GigabitEthernet0/0/0/0': {'cost': '1'},
 'Loopback0': {'cost': '1000'},
 'Loopback1': {'cost': '1'}}
我希望输出中有类似的内容:

{'GigabitEthernet0/0/0/0': {'cost': '1', 'area': 0},
 'Loopback0': {'cost': '1000', 'area': 0},
 'Loopback1': {'cost': '1', 'area': 0}}
对我的代码的任何建议或修改都将不胜感激

我会使用符号:

node.xpath(".//preceding::AreaID")[0].text
我正在执行的完整代码:

from lxml import etree as ET

x = ET.parse("input.xml")
d = {}
for node in x.iter('NameScope'):
    int_name = str(node.find('Naming/InterfaceName').text)
    d[int_name] = {
        'cost': str(node.find('Cost').text),
        'area': node.xpath(".//preceding::AreaID")[0].text 
    }

print(d)
印刷品:

{
    'Loopback0': {'cost': '1000', 'area': '0'}, 
    'Loopback1': {'cost': '1', 'area': '0'}, 
    'GigabitEthernet0/0/0/0': {'cost': '1', 'area': '0'}
}

谢谢你的回复。但是,“x”是一个xml.etree.ElementTree.Element对象。因此,节点没有xpath属性。我使用的是Python 2.7。此外,我还尝试了您建议的方法:“area=str(node.find(“.//preference::AreaID”)[0].text)”,然后出现了错误“SyntaxError:前缀映射中未找到前缀'preference'”。此外,我的输入不是xml文件,而是一个xml.etree.ElementTree.Element对象。@pypep278,即使我定义了一个
data
string变量并将
x
定义为
x=ET.fromstring(data)
,它也适用于我。如果使用
xpath()
方法会发生什么?非常感谢!与您的导入相反,我使用了以下导入,因此它对我来说失败了:import xml.etree.ElementTree as ET
{
    'Loopback0': {'cost': '1000', 'area': '0'}, 
    'Loopback1': {'cost': '1', 'area': '0'}, 
    'GigabitEthernet0/0/0/0': {'cost': '1', 'area': '0'}
}